PAT1016

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=1510;
int fare[1510];
struct R{
char name[25];
int M,D,h,m;
int totalMin;
int dayM;
bool state;
};
bool cmp(R &r1,R &r2)
{
int f=strcmp(r1.name,r2.name);
if(f!=0){
if(f<0)return true;
return false;
}
else {
return r1.totalMin<r2.totalMin;
}
}
int n;
R rec[maxn];
int main()
{
//freopen("in.txt","r",stdin);
for(int i=0;i<24;i++){
scanf("%d",&fare[i*60]);
for(int j=i*60+1;j<(i+1)*60;j++)
fare[j]=fare[j-1];
}
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char c[20];
scanf("%s %d:%d:%d:%d %s",
rec[i].name,&rec[i].M,&rec[i].D,&rec[i].h,&rec[i].m,c);
rec[i].totalMin=rec[i].D*24*60+rec[i].h*60+rec[i].m;
rec[i].dayM=rec[i].h*60+rec[i].m;
if(strcmp(c,"on-line")==0)rec[i].state=true;
else rec[i].state=false;
}
sort(rec,rec+n,cmp);
int nxtP=0;
while(nxtP<n)
{
char name[20];
strcpy(name,rec[nxtP].name);
int i=nxtP;
//在跳过不需要输出的记录遇到了一些困难
//参考算法笔记的代码
int needPrint=0;
while(i<n&&strcmp(name,rec[i].name)==0){
if(needPrint==0&&rec[i].state==true)needPrint=1;
else if(needPrint==1&&rec[i].state==false)needPrint=2;
i++;
}
if(needPrint<2){
nxtP=i;
continue;
}
printf("%s %02d\n",name,rec[nxtP].M);
double totalMoney=0;
for(int j=nxtP;j<i-1;j++)
{
if(rec[j].state==true&&rec[j+1].state==false){
int s=rec[j].totalMin,e=rec[j+1].totalMin;
int t=s;
double money=0;
while(t<e){
money+=fare[t%1440];
t++;
}
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n"
,rec[j].D,rec[j].h,rec[j].m
,rec[j+1].D,rec[j+1].h,rec[j+1].m
,e-s,money/100);
totalMoney+=money;
}
}
printf("Total amount: $%.2lf\n",totalMoney/100);
nxtP=i;
}
//getchar();
}

 

转载于:https://www.cnblogs.com/MalcolmMeng/p/8442974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值