1016. Phone Bills (25)

IDEA

1.主要思想:将对有记录按姓名-时间顺序排序,然后过滤不合法记录,最后最近收费

2.算时间差方法:算出每个人的总时间,然后相减

3.用printf输出string字符串,str.c_str()


文章参考别人的  http://blog.csdn.net/sunbaigui/article/details/8657062


CODE

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

struct Call{
	string name;
	int month,day,hour,minute;
	int total;
	string status;
};
int charge[24];
vector<Call> record;
vector<Call> vail_record;

int cmp(Call c1,Call c2){
	if(c1.name==c2.name){
		return c1.total<c2.total;
	} 
	return c1.name<c2.name;
}
//calculate money from the begin of month to the time given
int chargeByTime(int time){
	int hours = time/60;
	int minutes = time%60;
	int money = 0;
	int i;
	for(i=0;i<hours;i++)
		money+=charge[i%24]*60;
	money+=charge[i%24]*minutes;
	return money;
}

double calCost(Call on,Call off){
	return (double)(chargeByTime(off.total)-chargeByTime(on.total))/100;
}
int main()
{
	#ifndef ONLINE_JUDGE
	freopen("input.txt","r",stdin);
	#endif
	
	for(int i=0;i<24;i++){
		cin>>charge[i];
	}	
	int N;
	cin>>N;
	while(N--){
		Call call;
		cin>>call.name;
		scanf("%d:%d:%d:%d",&call.month,&call.day,&call.hour,&call.minute);
		call.total=call.minute+60*call.hour+24*60*call.day;
		cin>>call.status;
		record.push_back(call);
	}
	sort(record.begin(),record.end(),cmp);
	int flag=0;
	string currname;
	for(int i=0;i<record.size();i++){
		if(!flag&&record[i].status=="on-line"){
			vail_record.push_back(record[i]);
			flag=1;
			currname=record[i].name;
		}
		else if(flag&&record[i].status=="on-line"){
			vail_record.pop_back();
			vail_record.push_back(record[i]);
			flag=1;
			currname=record[i].name;
		}
		else if(flag&&record[i].status =="off-line"&&record[i].name==currname){
			vail_record.push_back(record[i]);
			flag=0;
		}
	}
	//最后一条记录必须为off-line,如果不是就删除 
	if((*(vail_record.end()-1)).status == "on-line"){
		vail_record.pop_back();
	} 
	double totalamount=0;
	currname="";
	for(int i=0;i<vail_record.size();i+=2){

		if(vail_record[i].name!=currname){
			if(currname!=""){
				printf("Total amount: $%.2f\n",totalamount);
				
				totalamount = 0;
				printf("%s %02d\n",vail_record[i].name.c_str(),vail_record[i].month);
			}
			else{
				printf("%s %02d\n",vail_record[i].name.c_str(),vail_record[i].month);
			}
			currname = vail_record[i].name;
		}
		//输出一条记录 
		printf("%02d:%02d:%02d",vail_record[i].day,vail_record[i].hour,vail_record[i].minute);
		printf(" ");
		printf("%02d:%02d:%02d",vail_record[i+1].day,vail_record[i+1].hour,vail_record[i+1].minute);
		printf(" ");
		printf("%d",vail_record[i+1].total-vail_record[i].total);
		printf(" ");
		printf("$%.2f\n",calCost(vail_record[i],vail_record[i+1]));
		
		totalamount+=calCost(vail_record[i],vail_record[i+1]);
	}
	printf("Total amount: $%.2f\n",totalamount);
	#ifndef ONLINE_JUDGE
	fclose(stdin);
	#endif
	return 0;
	
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值