一道水题。
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1016
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct record{
string name;
int month,day,hour,minute;
int status;
bool operator <(const record &A) const{
if(name==A.name){
if(month<A.month) return true;
else if(month==A.month){
if(day<A.day) return true;
else if(day==A.day){
if(hour<A.hour) return true;
else if(hour==A.hour){
if(minute<A.minute) return true;
else return false;
}
else return false;
}
else return false;
}
else return false;
}
else if(name>A.name) return false;
else return true;
}
};
struct call{
int month;
int sday,eday;
int shour,ehour;
int sminute,eminute;
int time;
double toll;
};
vector<record> rec;
vector<call> cal;
int toll[24];
double daytoll;
int gettime(call cal){
int res=0;
for(int i=cal.sday;i<cal.eday;i++) res+=24*60;
for(int i=0;i<cal.ehour;i++) res+=60;
res+=cal.eminute;
for(int i=0;i<cal.shour;i++) res-=60;
res-=cal.sminute;
return res;
}
double gettoll(call cal){
double res=0;
for(int i=0;i<cal.ehour;i++) res+=toll[i]*60;
res+=cal.eminute*toll[cal.ehour];
for(int i=0;i<cal.shour;i++) res-=toll[i]*60;
res-=cal.sminute*toll[cal.shour];
res/=100;
for(int i=cal.sday;i<cal.eday;i++) res+=daytoll;
return res;
}
int main(){
//freopen("C:\\Users\\Devon\\Desktop\\input.txt","r",stdin);
daytoll=0;
for(int i=0;i<24;i++){
cin>>toll[i];
daytoll+=toll[i]*60;
}
daytoll/=100;
int n;
cin>>n;
rec.clear();
for(int i=0;i<n;i++){
record temp;
string t;
cin>>temp.name;
cin>>temp.month;
getchar();
cin>>temp.day;
getchar();
cin>>temp.hour;
getchar();
cin>>temp.minute;
cin>>t;
if(t=="on-line") temp.status=1;
else temp.status=0;
rec.push_back(temp);
}
sort(rec.begin(),rec.end());
string str="";
cal.clear();
call tcal;
bool flag=false;
for(int i=0;i<n;i++){
if(rec[i].name==str){
if(rec[i].status==1){
tcal.month=rec[i].month;
tcal.sday=rec[i].day;
tcal.shour=rec[i].hour;
tcal.sminute=rec[i].minute;
flag=true;
}
else{
if(flag){
tcal.eday=rec[i].day;
tcal.ehour=rec[i].hour;
tcal.eminute=rec[i].minute;
tcal.toll=gettoll(tcal);
tcal.time=gettime(tcal);
cal.push_back(tcal);
flag=false;
}
}
}
if(rec[i].name!=str||i==n-1){
if(cal.size()>0){
printf("%s %02d\n",str.c_str(),cal[0].month);
double ttoll=0;
for(int j=0;j<(signed)cal.size();j++){
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",cal[j].sday,cal[j].shour,
cal[j].sminute,cal[j].eday,cal[j].ehour,cal[j].eminute,cal[j].time,
cal[j].toll);
ttoll+=cal[j].toll;
}
printf("Total amount: $%.2lf\n",ttoll);
cal.clear();
}
if(rec[i].status==1){
str=rec[i].name;
tcal.month=rec[i].month;
tcal.sday=rec[i].day;
tcal.shour=rec[i].hour;
tcal.sminute=rec[i].minute;
flag=true;
}
else str="";
}
}
return 0;
}