题目:PAT A 1016
题目大意
首先输入24整数,表示在一天中24个小时的某个时辰打电话的费率。(美分/每分钟)。
接下来有n
条记录。每条记录的格式如下:用户名
,MM:dd:HH:mm
(分别表示月:天:时:分)。以及一个类型表示接通on-line
和挂断off-line
。
题目需要按照用户名的字典序输出每个用户的账单。输出的格式为
用户名 月份
接通时间1 挂断时间1 通话时长1 费用1
接通时间2 挂断时间2 通话时长2 费用2
总计费用
首先本人感觉最难理解的部分是费用的计算。参考了别人的费用计算,但是,我没明白怎么回事
#include<bits/stdc++.h>
using namespace std;
int toll[25];
struct Node{
string name;
bool type;
int month,day,hour,minute,time;
};
vector<Node>recoder;
bool cmp(const Node &a,const Node &b){
if(a.name==b.name) return a.time<b.time;
return a.name<b.name;
}
double getBill(Node &a){
double total=toll[a.hour]*a.minute+toll[24]*60*a.day;
for(int i=0;i<a.hour;++i) total+=toll[i]*60;
return total/100.0;
}
int main(){
for(int i=0;i<24;++i){
scanf("%d",&toll[i]);
toll[24]+=toll[i];
}
int n;
scanf("%d",&n);
recoder.resize(n);
string temp;
for(int i=0;i<n;++i){
cin>>recoder[i].name;
scanf("%d:%d:%d:%d",&recoder[i].month,&recoder[i].day,&recoder[i].hour,&recoder[i].minute);
recoder[i].time=recoder[i].day*24*60+recoder[i].hour*60+recoder[i].minute;
cin>>temp;
if(temp=="on-line") recoder[i].type=1;
else recoder[i].type=0;
}
sort(recoder.begin(),recoder.end(),cmp);
map<string,vector<Node> > custom ;//用map记录每个用户的账单
for(int i=1;i<n;++i){
if(recoder[i].name==recoder[i-1].name&&recoder[i].type==0&&recoder[i-1].type==1){
custom[recoder[i].name].push_back(recoder[i-1]);
custom[recoder[i].name].push_back(recoder[i]);
}
}
map<string,vector<Node>>::iterator it;
for(it=custom.begin();it!=custom.end();it++){
vector<Node>tmp=it->second;
cout<<it->first;
printf(" %02d\n",tmp[0].month);
double total=0;
for(int i=1;i<tmp.size();i+=2){
double t=getBill(tmp[i])-getBill(tmp[i-1]);
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\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,t);
total+=t;
}
printf("Total amount: $%.2f\n",total);
}
system("pause");
return 0;
}