1016. Phone Bills (25)
2016-07-24 11:11
369 查看
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;
}
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;
}
相关文章推荐
- PowerShell中计算时间差的方法
- asp下用datediff实现计算两个时间差的函数
- javascript时间差插件分享
- C#获取两个时间的时间差并去除周末(取工作日)的方法
- php 8小时时间差的解决方法小结
- 在php和MySql中计算时间差的方法
- js计算时间差代码【包括计算,天,时,分,秒】
- Javascript计算时间差的函数分享
- android获取时间差的方法
- 在php和MySql中计算时间差的方法详解
- Java中计算时间差的方法
- python计算时间差的方法
- python利用datetime模块计算时间差
- php计算两个日期时间差(返回年、月、日)
- libdvbpsi源码分析(四)PAT表解析/重建
- js 求时间差的实现代码
- js计算时间差代码【包括计算,天,时,分,秒】
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- php 获取时间差