0%

PAT A1016 Phone Bills

题目链接

我的解法:一次通过!

1、首先编写比较函数,将所有数据排序,排好了之后应该是每对“on-line”和“off-line”的记录都相邻。

2、两个两个的遍历记录,i和i+1,当满足名字相同,月份相同,并且两个配对的时候就进行下一步操作。

3、要首先打印姓名和月份,这时候可以先定义两个中间变量,name和mon,并初始化,然后每次第一个与名字相同时就不打印,不相同就打印,也就是实现了单人的记录只打印了一次姓名和月份!

4、打印每一对起始时间和总分钟和花费。因为if里面一定是on和off匹配的一对,所以这一对的总分钟和花费用两个函数单独实现。

5、最后打印该月订单的总花费。在for最外层定义一个rate_sum,只要在每次打印下一个姓名之前打印即可,第一个不用打印,所以设置一个cnt计数,最后一个记录的rate_sum没打印到,所以在for循环结束后打印即可!

注意

1、注意空格的输出!

2、strcmp(a,b)函数可以直接将a替换为b!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1010;
int rates[24];
int n;
struct Bill{
char name[21];
int mon,day,h,m;
char state[10];
}bills[maxn];
bool cmp(Bill a,Bill b){
if(strcmp(a.name,b.name)!=0) return strcmp(a.name,b.name)<0;
else if(a.mon!=b.mon) return a.mon<b.mon;
else if(a.day!=b.day) return a.day<b.day;
else if(a.h!=b.h) return a.h<b.h;
else return a.m<b.m;
}
//获取起始时间的总分钟数
int get_mt(const Bill& a,const Bill& b){
int d,h,m;
d=b.day-a.day;
h=d*24+b.h-a.h;
m=h*60+b.m-a.m;
return m;
}
double get_rate(const Bill& a,const Bill& b){
int sum=0;
Bill t=b;
if(a.day==b.day&&a.h==b.h){
sum=(b.m-a.m)*rates[b.h];
}else{
sum+=b.m*rates[b.h];
while(true){
t.h--;
if(t.h>=0){
sum+=rates[t.h]*60;
if(t.h==a.h&&a.day==t.day) break;
}
else if(t.day>a.day){
t.h=24;
t.day--;
}
}
sum-=(a.m*rates[a.h]);
}
return sum/100.0;
}
int main(){
for(int i=0;i<24;i++) scanf("%d",&rates[i]);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %d:%d:%d:%d %s",&bills[i].name,&bills[i].mon,&bills[i].day,
&bills[i].h,&bills[i].m,&bills[i].state);
}
sort(bills,bills+n,cmp);
char name[21]="xxx";
int mon=-1,cnt=0;
// printf("-------------\n");
double rate_sum=0.0,rate=0.0;
for(int i=0;i<n-1;i++){
int mt_sum=0;
if(strcmp(bills[i].name,bills[i+1].name)==0&&
bills[i].mon==bills[i+1].mon&&
strcmp(bills[i].state,"on-line")==0&&
strcmp(bills[i+1].state,"off-line")==0)
{
if(strcmp(name,bills[i].name)!=0||mon!=bills[i].mon){
strcpy(name,bills[i].name);
mon=bills[i].mon;
if(cnt!=0){
printf("Total amount: $%.2f\n",rate_sum);
rate_sum=0.0;
}
printf("%s %02d\n",name,mon);
cnt++;
}

mt_sum=get_mt(bills[i],bills[i+1]);
rate=get_rate(bills[i],bills[i+1]);
rate_sum+=rate;

printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",
bills[i].day,bills[i].h,bills[i].m,
bills[i+1].day,bills[i+1].h,bills[i+1].m,mt_sum,rate);

i++;
}
}
printf("Total amount: $%.2f\n",rate_sum);

return 0;
}

本文标题:PAT A1016 Phone Bills

文章作者:GavinYGM

发布时间:2020年08月25日 - 01:08

最后更新:2020年08月25日 - 01:08

原始链接:http://www.gavinygm.cn/2020/08/25/PAT-A1016-Phone-Bills/

许可协议: 转载请保留原文链接及作者。