思路:
将所有记录按照时间先后排序,然后统计时间符合前面起始,后面终止的且名称相同的记录,然后统计这些
记录对的时间,价格,第一个记录特殊标记一下就好了。
难点:计算时间的花费,记录起始时间st,终止时间ed,然后求出这段时间内的收费情况。
可以计算从这个月的00:00:00开始,到时间点x的花费的函数cal(),然后让cost=cal(ed)-cal(st)。
cal()函数从0h开始,统计这个月的x中有多少整点小时,然后再统计x的不足1h的时间。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100100;
struct Node{
char name[50],stu[20];
int mo,dd,hh,mm,tim,zt;
}cur[maxn];
int ttm[50];
bool cmp(Node a,Node b)
{
if(strcmp(a.name,b.name)!=0) return strcmp(a.name,b.name)<0;
else return a.tim<b.tim;
}
double cal(int t)
{
double sum=0;
int i;
for(i=0;i<t/60;i++){
sum+=ttm[i%24]*60/100.0;
}
sum+=ttm[i%24]*(t%60)/100.0;
return sum;
}
int main(void)
{
int n,i,x,j,fg;
for(i=0;i<24;i++) scanf("%d",&ttm[i]);
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s %d:%d:%d:%d %s",cur[i].name,&cur[i].mo,&cur[i].dd,&cur[i].hh,&cur[i].mm,cur[i].stu);
if(strcmp(cur[i].stu,"on-line")==0) cur[i].zt=1;
else cur[i].zt=-1;
cur[i].tim=cur[i].dd*24*60+cur[i].hh*60+cur[i].mm;
}
sort(cur,cur+n,cmp);
char str[50];
fg=0;
double sum=0,tp;
for(i=1;i<=n;i++){
if(cur[i-1].zt==1&&cur[i].zt==-1&&strcmp(cur[i-1].name,cur[i].name)==0){
if(fg==0){
strcpy(str,cur[i-1].name);
fg=1;sum=0;
printf("%s %02d\n",cur[i-1].name,cur[i-1].mo);
}
if(strcmp(str,cur[i-1].name)!=0){
printf("Total amount: $%.2lf\n",sum);
sum=0;
strcpy(str,cur[i-1].name);
printf("%s %02d\n",cur[i-1].name,cur[i-1].mo);
tp=cal(cur[i].tim)-cal(cur[i-1].tim);
sum+=tp;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",cur[i-1].dd,cur[i-1].hh,cur[i-1].mm,
cur[i].dd,cur[i].hh,cur[i].mm,cur[i].tim-cur[i-1].tim,tp);
}
else{
tp=cal(cur[i].tim)-cal(cur[i-1].tim);
sum+=tp;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",cur[i-1].dd,cur[i-1].hh,cur[i-1].mm,
cur[i].dd,cur[i].hh,cur[i].mm,cur[i].tim-cur[i-1].tim,tp);
}
}
}
printf("Total amount: $%.2lf\n",sum);
return 0;
}