这道题比较烦人,关键是逻辑弄通。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct users{
char ID[24];
int mon;
int dd;
int hh;
int mm;
int state = 0; //on line =1 offline =2
}user[1010];
bool cmp(users a, users b) {
int s=strcmp(a.ID,b.ID);
if (s!=0) return s<0;
else if (a.mon!=b.mon) return a.mon<b.mon;
else if (a.dd!=b.dd) return a.dd<b.dd;
else if (a.hh!=b.hh) return a.hh<b.hh;
else return a.mm<b.mm;
}
int price[24]; //每小时的费用
double output(users a,users b){ //计算两者的资费
double num=0;
if (b.mon==a.mon){
if (b.hh!=a.hh || (b.hh==a.hh && b.mm!=a.mm)){ //先使得h和m一致,再看d差几个
while (b.hh != a.hh){ //先使h一致
num = num+price[a.hh]*(60-a.mm);
a.mm = 0;
a.hh++;
if (a.hh==24) {
a.hh=0;
a.dd++;
}
}
num = num+price[a.hh]*(b.mm-a.mm);
a.mm = b.mm; //m一致
}
while(b.dd!=a.dd) { //再算d
for (int j=0;j<24;j++){
num = num+ price[j]*60;
}
a.dd++;
}
}
return num;
}
int main(){
for (int i=0;i<24;i++){
scanf("%d",&price[i]);
}
int n;
scanf("%d",&n);
for (int i=0;i<n;i++){
char state[8];
scanf("%s",&user[i].ID);
scanf("%d:%d:%d:%d",&user[i].mon,&user[i].dd,&user[i].hh,&user[i].mm);
scanf("%s",&state);
if (strcmp(state,"on-line")==0) user[i].state = 1;
else user[i].state = 2;
}
sort(user,user+n,cmp); //排序
char now[24]; //当前的ID
int i=0,t=0;
bool flag[1010]={false}; //头和尾只输出一次,用flag[t]来标记
double tnum=0;
while (i<n){ //要遍历全部
strcpy(now,user[i].ID);
while (strcmp(now,user[i].ID)==0){ //遇到ID与NOW一致
double num=0;
if (strcmp(now,user[i+1].ID)==0 && user[i].state==1 && user[i+1].state==2){ //需要输出的情况
if (flag[t]==false){ //判断是不是第一次输出,若是第一次要额外输出信息
printf("%s %02d\n",user[i].ID,user[i].mon);
flag[t]=true;
} //非额外则正常输出
printf("%02d:%02d:%02d ",user[i].dd,user[i].hh,user[i].mm);
printf("%02d:%02d:%02d ",user[i+1].dd,user[i+1].hh,user[i+1].mm);
int ttime = (user[i+1].dd*24*60+user[i+1].hh*60+user[i+1].mm)-(user[i].dd*24*60+user[i].hh*60+user[i].mm);
printf("%d ",ttime);
num = output(user[i],user[i+1]); //调用函数来计算资费
tnum = tnum +num;
printf("$%.2f\n",num/100);
i=i+2; //过了一对i到下一个
}
else { //若是非输出,i就1个1个走,直到ID与NOW不一致
i=i+1;
}
} //ID与NOW不一致,要更新NOW,并且输出total amount
if (flag[t]==true) {
printf("Total amount: $%.2f\n",tnum/100);
tnum=0;
t++;
}
}
return 0;
}