题意:
输入24个正整数代表从0到23每个小时通话一分钟花费的美分。输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态。
按照字典序输出用户的名字,(每一段,按行输出)通话时长和花费,以及Total amount。
trick:
对于没打通的用户(没有花费),不要输出它的Total amount。(第1,2数据点答案错误原因)
代码:
#include<bits/stdc++.h>
using namespace std;
int a[27];
typedef struct users{
string name;
int month,day,hour,minute,time;
string condition;
int flag;
};
users user[1007];
bool cmp(users a,users b){
if(a.name!=b.name)
return a.name<b.name;
else{
if(a.day!=b.day)
return a.day<b.day;
else if(a.hour!=b.hour)
return a.hour<b.hour;
else
return a.minute<b.minute;
}
}
map<string,double>mp;
int main(){
int all=0;
for(int i=0;i<24;++i){
cin>>a[i];
all+=a[i];
}
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>user[i].name;
scanf("%d:%d:%d:%d ",&user[i].month,&user[i].day,&user[i].hour,&user[i].minute);
cin>>user[i].condition;
if(user[i].condition[1]==‘n‘)
user[i].flag=1;
}
sort(user+1,user+1+n,cmp);
string tmp=user[1].name;
user[n+1].name="sewage";
for(int i=1;i<=n+1;++i){
if(user[i].name!=tmp&&mp[tmp])
printf("Total amount: $%.2f\n",mp[tmp]);
tmp=user[i].name;
if(user[i].flag==1&&user[i+1].flag==0&&user[i].name==user[i+1].name){
if(!mp[user[i].name]){
cout<<user[i].name;
printf(" %02d\n",user[i].month);
}
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);
double sum=0;
int mm=0;
mm+=60-user[i].minute;
sum=1.0*(60-user[i].minute)*a[user[i].hour];
mm+=user[i+1].minute;
sum+=1.0*user[i+1].minute*a[user[i+1].hour];
user[i].hour++;
for(int j=user[i].hour;j<24;++j)
sum+=1.0*a[j]*60,mm+=60;
for(int j=0;j<user[i+1].hour;++j)
sum+=1.0*a[j]*60,mm+=60;
mm+=(user[i+1].day-user[i].day-1)*1440;
sum+=1.0*(user[i+1].day-user[i].day-1)*all*60;
sum/=100.0;
printf("%d $%.2f\n",mm,sum);
mp[user[i].name]+=sum;
++i;
}
}
return 0;
}
【PAT甲级】1016 Phone Bills (25 分)(结构体排序)
原文:https://www.cnblogs.com/ldudxy/p/11281732.html