【PAT甲级】1016 Phone Bills (25 分)(结构体排序)

题意:

输入24个正整数代表从0到23每个小时通话一分钟花费的美分。输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态。

按照字典序输出用户的名字,(每一段,按行输出)通话时长和花费,以及Total amount。

trick:

对于没打通的用户(没有花费),不要输出它的Total amount。(第1,2数据点答案错误原因)

AAAAAccepted code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[27];
 4 typedef struct users{
 5     string name;
 6     int month,day,hour,minute,time;
 7     string condition;
 8     int flag;
 9 };
10 users user[1007];
11 bool cmp(users a,users b){
12     if(a.name!=b.name)
13         return a.name<b.name;
14     else{
15         if(a.day!=b.day)
16             return a.day<b.day;
17         else if(a.hour!=b.hour)
18             return a.hour<b.hour;
19         else
20             return a.minute<b.minute;
21     }
22 }
23 map<string,double>mp;
24 int main(){
25     int all=0;
26     for(int i=0;i<24;++i){
27         cin>>a[i];
28         all+=a[i];
29     }
30     int n;
31     cin>>n;
32     for(int i=1;i<=n;++i){
33         cin>>user[i].name;
34         scanf("%d:%d:%d:%d ",&user[i].month,&user[i].day,&user[i].hour,&user[i].minute);
35         cin>>user[i].condition;
36         if(user[i].condition[1]=='n')
37             user[i].flag=1;
38     }
39     sort(user+1,user+1+n,cmp);
40     string tmp=user[1].name;
41     user[n+1].name="sewage";
42     for(int i=1;i<=n+1;++i){
43         if(user[i].name!=tmp&&mp[tmp])
44             printf("Total amount: $%.2f\n",mp[tmp]);
45         tmp=user[i].name;
46         if(user[i].flag==1&&user[i+1].flag==0&&user[i].name==user[i+1].name){
47             if(!mp[user[i].name]){
48                 cout<<user[i].name;
49                 printf(" %02d\n",user[i].month);
50             }
51             printf("%02d:%02d:%02d %02d:%02d:%02d ",user[i].day,user[i].hour,user[i].minute,user[i+1].day,user[i+1].hour,user[i+1].minute);
52             double sum=0;
53             int mm=0;
54             mm+=60-user[i].minute;
55             sum=1.0*(60-user[i].minute)*a[user[i].hour];
56             mm+=user[i+1].minute;
57             sum+=1.0*user[i+1].minute*a[user[i+1].hour];
58             user[i].hour++;
59             for(int j=user[i].hour;j<24;++j)
60                 sum+=1.0*a[j]*60,mm+=60;
61             for(int j=0;j<user[i+1].hour;++j)
62                 sum+=1.0*a[j]*60,mm+=60;
63             mm+=(user[i+1].day-user[i].day-1)*1440;
64             sum+=1.0*(user[i+1].day-user[i].day-1)*all*60;
65             sum/=100.0;
66             printf("%d $%.2f\n",mm,sum);
67             mp[user[i].name]+=sum;
68             ++i;
69         }
70     }
71     return 0;
72 }

 

 

 

posted @ 2019-08-01 12:21  sewage  阅读(156)  评论(0编辑  收藏  举报