#include<iostream>
#include<vector>
#include<map>
#include<unordered_map>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN=1005;
struct record{
string name;
int mon,day,hour,minute;
int time;
int flag;//当flag=0时表示挂断,当flag=1时,表示接通;
}Record;
int N;
int day_C=0; //一天的电话费;
int expense[24];//存储24小时各个时段的收费情况cent/minute;
unordered_map<string,vector<record> > bill; //以客户姓名为关键字,存储每个客户的账单;
map< string,vector<record> > processedBill;
void bill_processor(string name){
int Size=bill[name].size();
for(int i=1;i<Size;++i)
if(bill[name][i].flag==0&&bill[name][i-1].flag==1){
processedBill[name].push_back(bill[name][i-1]);
processedBill[name].push_back(bill[name][i]);
}
}
double cal_cost_from_0(int d,int h,int m){
int cost=0;
cost+=(d-1)*day_C;
for(int i=0;i<h;++i)
cost+=expense[i]*60;
cost+=expense[h]*m;
return cost/100.0;
}
void GetBill(){
for(auto it=processedBill.begin();it!=processedBill.end();++it){
vector<record> tmp=it->second;
int len=tmp.size();
double totalC=0.0;
printf("%s %02d\n",it->first.c_str(),tmp[0].mon);
for(int i=1;i<len;i+=2){
double cost1=cal_cost_from_0(tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute);
double cost2=cal_cost_from_0(tmp[i].day,tmp[i].hour,tmp[i].minute);
totalC+=cost2-cost1;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute,
tmp[i].day,tmp[i].hour,tmp[i].minute,tmp[i].time-tmp[i-1].time,cost2-cost1);
}
printf("Total amount: $%.2lf\n",totalC);
}
}
bool mycompare(record a,record b){
return a.time<b.time;
}
int main(){
for(int i=0;i<24;i++){
scanf("%d",&expense[i]);
day_C+=expense[i];
}
day_C*=60;
scanf("%d",&N);
string str_flag;
for(int i=0;i<N;i++){
cin>>Record.name;
scanf("%d:%d:%d:%d",&Record.mon,&Record.day,&Record.hour,&Record.minute);
cin>>str_flag;
Record.time=Record.day*24*60+Record.hour*60+Record.minute;
Record.flag=(str_flag=="on-line")?1:0;
bill[Record.name].push_back(Record);
}
for(auto it=bill.begin();it!=bill.end();++it){
sort(it->second.begin(),it->second.end(),mycompare);
bill_processor(it->first); //获取每个用户的有效通话记录到processedBill;
}
GetBill();
system("pause");
return 0;
}
这道题,开始犯了一个比较低级的错误,我把打一整天电话的费用直接用给出的测试案例给算出来了,还愣是看几遍没看出来!后来发现,改了以后测试案例0、3通过了,但是1、2不过,感觉自己思路没有问题,又对比了柳婼的代码,我发现它的费用是一直用cent来计算的,直到最后计算从00:00:00到给出的日期的费用时,他才转换成dollar(也就是除以100.0),这时我才感觉可能是浮点数计算的精度出了问题,于是采用美分来记录每小时的花费,最后一次性转换为美元,然后就AC了,所以想说,尽量少用除法吧。