您的位置:首页 > 其它

1016. Phone Bills (25)

2016-07-24 11:11 369 查看
IDEA

1.主要思想:将对有记录按姓名-时间顺序排序,然后过滤不合法记录,最后最近收费

2.算时间差方法:算出每个人的总时间,然后相减

3.用printf输出string字符串,str.c_str()

文章参考别人的  http://blog.csdn.net/sunbaigui/article/details/8657062



CODE

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

struct Call{
string name;
int month,day,hour,minute;
int total;
string status;
};
int charge[24];
vector<Call> record;
vector<Call> vail_record;

int cmp(Call c1,Call c2){
if(c1.name==c2.name){
return c1.total<c2.total;
}
return c1.name<c2.name;
}
//calculate money from the begin of month to the time given
int chargeByTime(int time){
int hours = time/60;
int minutes = time%60;
int money = 0;
int i;
for(i=0;i<hours;i++)
money+=charge[i%24]*60;
money+=charge[i%24]*minutes;
return money;
}

double calCost(Call on,Call off){
return (double)(chargeByTime(off.total)-chargeByTime(on.total))/100;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif

for(int i=0;i<24;i++){
cin>>charge[i];
}
int N;
cin>>N;
while(N--){
Call call;
cin>>call.name;
scanf("%d:%d:%d:%d",&call.month,&call.day,&call.hour,&call.minute);
call.total=call.minute+60*call.hour+24*60*call.day;
cin>>call.status;
record.push_back(call);
}
sort(record.begin(),record.end(),cmp);
int flag=0;
string currname;
for(int i=0;i<record.size();i++){
if(!flag&&record[i].status=="on-line"){
vail_record.push_back(record[i]);
flag=1;
currname=record[i].name;
}
else if(flag&&record[i].status=="on-line"){
vail_record.pop_back();
vail_record.push_back(record[i]);
flag=1;
currname=record[i].name;
}
else if(flag&&record[i].status =="off-line"&&record[i].name==currname){
vail_record.push_back(record[i]);
flag=0;
}
}
//最后一条记录必须为off-line,如果不是就删除
if((*(vail_record.end()-1)).status == "on-line"){
vail_record.pop_back();
}
double totalamount=0;
currname="";
for(int i=0;i<vail_record.size();i+=2){

if(vail_record[i].name!=currname){
if(currname!=""){
printf("Total amount: $%.2f\n",totalamount);

totalamount = 0;
printf("%s %02d\n",vail_record[i].name.c_str(),vail_record[i].month);
}
else{
printf("%s %02d\n",vail_record[i].name.c_str(),vail_record[i].month);
}
currname = vail_record[i].name;
}
//输出一条记录
printf("%02d:%02d:%02d",vail_record[i].day,vail_record[i].hour,vail_record[i].minute);
printf(" ");
printf("%02d:%02d:%02d",vail_record[i+1].day,vail_record[i+1].hour,vail_record[i+1].minute);
printf(" ");
printf("%d",vail_record[i+1].total-vail_record[i].total);
printf(" ");
printf("$%.2f\n",calCost(vail_record[i],vail_record[i+1]));

totalamount+=calCost(vail_record[i],vail_record[i+1]);
}
printf("Total amount: $%.2f\n",totalamount);
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT 时间差