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;
}