方法:排序,输出有效数据
注意点:1,电话记录跨天的情况;2,注意无效数据,无效数据不输出任何内容。
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int cost[24],numr,daycost=0;
struct record{
char name[23];
int mo,d,h,mi,flag;
};
record rec[1010];
bool cmp(record a,record b){
int s=strcmp(a.name,b.name);
if(s!=0) return s<0;
else if(a.mo!=b.mo) return a.mo<b.mo;
else if(a.d!=b.d) return a.d<b.d;
else if(a.h!=b.h) return a.h<b.h;
else return a.mi<b.mi;
}
float getcost(int pos){
float sum=0;
sum+=daycost*rec[pos].d*0.6+cost[rec[pos].h]*0.01*rec[pos].mi;
for(int i=0;i<rec[pos].h;i++){
sum+=cost[i]*0.6;
}
return sum;
}
int main(){
for(int i=0;i<24;i++){
scanf("%d",&cost[i]);
daycost+=cost[i];
}
scanf("%d",&numr);
int index=0;
for(int i=0;i<numr;i++){
char temp[10];
scanf("%s%d:%d:%d:%d%s",rec[index].name,&rec[index].mo,&rec[index].d,&rec[index].h,&rec[index].mi,temp);
if(temp[1]=='n') rec[index].flag=0;
else rec[index].flag=1;
index++;
}
sort(rec,rec+index,cmp);
for(int i=0;i<index;i++){
char temp[23];
int len=1;
float sum=0;
if(strcmp(temp,rec[i].name)!=0){
int initial_i=i;
bool exist=false;
strcpy(temp,rec[i].name);
for(;i<index&&strcmp(temp,rec[i].name)==0;i++){
if(strcmp(rec[i+1].name,rec[i].name)==0&&rec[i].flag==0&&rec[i+1].flag==1){
exist=true;
}
}
i--;
if(!exist) continue; //处理无效数据
i=initial_i;
printf("%s %02d\n",rec[i].name,rec[i].mo);
for(;i<index&&strcmp(temp,rec[i].name)==0;i++){
if(strcmp(rec[i+1].name,rec[i].name)==0&&rec[i].flag==0&&rec[i+1].flag==1){
printf("%02d:%02d:%02d %02d:%02d:%02d",rec[i].d,rec[i].h,rec[i].mi,rec[i+1].d,rec[i+1].h,rec[i+1].mi);
printf(" %d",(rec[i+1].d*24*60+rec[i+1].h*60+rec[i+1].mi)-(rec[i].d*24*60+rec[i].h*60+rec[i].mi));
sum+=(getcost(i+1)-getcost(i));
printf(" $%.2f\n",getcost(i+1)-getcost(i));
i++;
}
}
i--; //
printf("Total amount: $%.2f\n",sum);
}
}
return 0;
}