关键点:
1. 用qsort进行一次排序,由于qsort是不稳定的,所以不能分时间和名字两次排序
2. 费用计算问题,需考虑dd相等和hh相等的情况
3. total输出判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <cstdio> #include <cstdlib> #include <cstring> int rate[24]; int n; int time; float total=0; typedef struct{ char name[21]; char time[21]; char state[10]; }record; record rec[1001]; int cmp(const void *a1, const void *a2){ record *r1=(record *)a1,*r2=(record *)a2; if(strcmp(r1->name,r2->name)==0) return strcmp(((record *)a1)->time,((record *)a2)->time); return strcmp(r1->name,r2->name); } float calc(char *t1,char *t2){ int d=(t2[0]-t1[0])*10+t2[1]-t1[1]; int h1,h2,m1,m2; float fee; h1=(t1[3]-'0')*10+t1[4]-'0'; h2=(t2[3]-'0')*10+t2[4]-'0'+24*d; m1=(t1[6]-'0')*10+t1[7]-'0'; m2=(t2[6]-'0')*10+t2[7]-'0'; time=(h2-h1)*60+m2-m1; if(h1==h2) fee=rate[h1]*(m2-m1); else fee=rate[h1]*(60-m1)+rate[h2%24]*m2; for(h1++;h1<h2;h1++) fee+=rate[h1%24]*60; return fee/100; } int main(){ for(int i=0;i<24;i++) scanf("%d",&rate[i]); scanf("%d",&n); for(int i=0;i<n;i++) scanf("%s%s%s",rec[i].name,rec[i].time,rec[i].state); qsort(rec,n,sizeof(record),cmp); bool output=false; //当前name是否输出过记录 for(int i=0;i<n-1;i++){ if(strcmp(rec[i].name,rec[i+1].name)){ //the name of next record is not same as the current one if(output){ output=false; printf("Total amount: $%.2f\n",total); total=0; } } else if(strncmp(rec[i].state,"on",2)==0 && strncmp(rec[i+1].state,"of",2)==0){ if(!output){ printf("%s %c%c\n",rec[i].name,rec[i].time[0],rec[i].time[1]); output=true; } time=0; float fee=calc(rec[i].time+3,rec[i+1].time+3); total+=fee; printf("%s %s %d $%.2f\n",&rec[i].time[3],&rec[i+1].time[3],time,fee); } } if(total>0) printf("Total amount: $%.2f",total); return 0; } |