PAT甲级1016——Phone Bills

#include<iostream>
#include<vector>
#include<map>
#include<unordered_map>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN=1005;
struct record{
	string name;
	int mon,day,hour,minute;
	int time;
	int flag;//当flag=0时表示挂断,当flag=1时,表示接通;
}Record;
int N;
int day_C=0;     //一天的电话费;
int expense[24];//存储24小时各个时段的收费情况cent/minute;
unordered_map<string,vector<record> > bill;    //以客户姓名为关键字,存储每个客户的账单;
map< string,vector<record> > processedBill;
void bill_processor(string name){
	int Size=bill[name].size();
	for(int i=1;i<Size;++i)
		if(bill[name][i].flag==0&&bill[name][i-1].flag==1){
           processedBill[name].push_back(bill[name][i-1]);
		   processedBill[name].push_back(bill[name][i]);
	    }
}
double cal_cost_from_0(int d,int h,int m){
	int cost=0;
	cost+=(d-1)*day_C;
	for(int i=0;i<h;++i)
		cost+=expense[i]*60;
	cost+=expense[h]*m;
	return cost/100.0;
}
void GetBill(){
	for(auto it=processedBill.begin();it!=processedBill.end();++it){
		vector<record> tmp=it->second;
		int len=tmp.size();
		double totalC=0.0;
		printf("%s %02d\n",it->first.c_str(),tmp[0].mon);
		for(int i=1;i<len;i+=2){
			double cost1=cal_cost_from_0(tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute);
			double cost2=cal_cost_from_0(tmp[i].day,tmp[i].hour,tmp[i].minute);
			totalC+=cost2-cost1;
			printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute,
				tmp[i].day,tmp[i].hour,tmp[i].minute,tmp[i].time-tmp[i-1].time,cost2-cost1);
		}
		printf("Total amount: $%.2lf\n",totalC);
	}
}
bool mycompare(record a,record b){
	return a.time<b.time;
}
int main(){
	for(int i=0;i<24;i++){
		scanf("%d",&expense[i]);
		day_C+=expense[i];
	}
	day_C*=60;
	scanf("%d",&N);
	string str_flag;
	for(int i=0;i<N;i++){
		cin>>Record.name;
		scanf("%d:%d:%d:%d",&Record.mon,&Record.day,&Record.hour,&Record.minute);
		cin>>str_flag;
		Record.time=Record.day*24*60+Record.hour*60+Record.minute;
		Record.flag=(str_flag=="on-line")?1:0;
		bill[Record.name].push_back(Record);
	}
	for(auto it=bill.begin();it!=bill.end();++it){
		sort(it->second.begin(),it->second.end(),mycompare);
		bill_processor(it->first);   //获取每个用户的有效通话记录到processedBill;
	}
	GetBill();
	system("pause");
	return 0;
} 

这道题,开始犯了一个比较低级的错误,我把打一整天电话的费用直接用给出的测试案例给算出来了,还愣是看几遍没看出来!后来发现,改了以后测试案例0、3通过了,但是1、2不过,感觉自己思路没有问题,又对比了柳婼的代码,我发现它的费用是一直用cent来计算的,直到最后计算从00:00:00到给出的日期的费用时,他才转换成dollar(也就是除以100.0),这时我才感觉可能是浮点数计算的精度出了问题,于是采用美分来记录每小时的花费,最后一次性转换为美元,然后就AC了,所以想说,尽量少用除法吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值