题意
- 不能直接输出姓名,因为如果你的账单不符合,你的名字是不会被打印出来的。
- 排序题
code
#include <bits/stdc++.h>
using namespace std;
struct node{
string name;
int month,day,hh,mm,status;
int last;
};
int p[25];
bool cmp(node a,node b){
return a.name!=b.name?a.name<b.name:a.last<b.last;
}
double bill(node a){
double sum=0;
sum=p[24]*a.day*60+p[a.hh]*a.mm;
for(int i=0;i<a.hh;i++) sum+=60*p[i];
return sum/100;
}
int main(){
for(int i=0;i<24;i++){
cin>>p[i];
p[24]+=p[i];
}
int n;
cin>>n;
node res[n];
for(int i=0;i<n;i++){
cin>>res[i].name;
scanf("%d:%d:%d:%d",&res[i].month,&res[i].day,&res[i].hh,&res[i].mm);
string s;
cin>>s;
s=="on-line"?res[i].status=1:res[i].status=0;
res[i].last=res[i].day*24*60+res[i].hh*60+res[i].mm;
}
sort(res,res+n,cmp);
string name;
map<string,vector<node>> m;
for(int i=1;i<n;i++)
if(res[i].name==res[i-1].name&&res[i].status==0&&res[i-1].status==1){
m[res[i].name].push_back(res[i-1]);
m[res[i].name].push_back(res[i]);
}
for(auto it:m){
printf("%s %02d\n",it.first.c_str(),it.second[0].month);
double sum=0,t=0;
for (int i=1;i<it.second.size();i+=2){
t=bill(it.second[i])-bill(it.second[i-1]);
sum+=t;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",it.second[i-1].day,it.second[i-1].hh,it.second[i-1].mm,it.second[i].day,it.second[i].hh,it.second[i].mm,it.second[i].last-it.second[i-1].last,t);
}
printf("Total amount: $%.2f\n",sum);
}
return 0;
}