PAT A1016

方法:排序,输出有效数据

注意点: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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值