本文主要是介绍1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1016. Phone Bills (25)
A long-distance telephone company charges its customers by the following rules:
Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. When a customer starts connecting a long-distance call, the time will be recorded, and so will be the time when the customer hangs up the phone. Every calendar month, a bill is sent to the customer for each minute called (at a rate determined by the time of day). Your job is to prepare the bills for each month, given a set of phone call records.
Input Specification:
Each input file contains one test case. Each case has two parts: the rate structure, and the phone call records.
The rate structure consists of a line with 24 non-negative integers denoting the toll (cents/minute) from 00:00 - 01:00, the toll from 01:00 - 02:00, and so on for each hour in the day.
The next line contains a positive number N (<= 1000), followed by N lines of records. Each phone call record consists of the name of the customer (string of up to 20 characters without space), the time and date (mm:dd:hh:mm), and the word "on-line" or "off-line".
For each test case, all dates will be within a single month. Each "on-line" record is paired with the chronologically next record for the same customer provided it is an "off-line" record. Any "on-line" records that are not paired with an "off-line" record are ignored, as are "off-line" records not paired with an "on-line" record. It is guaranteed that at least one call is well paired in the input. You may assume that no two records for the same customer have the same time. Times are recorded using a 24-hour clock.
Output Specification:
For each test case, you must print a phone bill for each customer.
Bills must be printed in alphabetical order of customers' names. For each customer, first print in a line the name of the customer and the month of the bill in the format shown by the sample. Then for each time period of a call, print in one line the beginning and ending time and date (dd:hh:mm), the lasting time (in minute) and the charge of the call. The calls must be listed in chronological order. Finally, print the total charge for the month in the format shown by the sample.
Sample Input:10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10 10 CYLL 01:01:06:01 on-line CYLL 01:28:16:05 off-line CYJJ 01:01:07:00 off-line CYLL 01:01:08:03 off-line CYJJ 01:01:05:59 on-line aaa 01:01:01:03 on-line aaa 01:02:00:01 on-line CYLL 01:28:15:41 on-line aaa 01:05:02:24 on-line aaa 01:04:23:59 off-lineSample Output:
CYJJ 01 01:05:59 01:07:00 61 $12.10 Total amount: $12.10 CYLL 01 01:06:01 01:08:03 122 $24.40 28:15:41 28:16:05 24 $3.85 Total amount: $28.25 aaa 01 02:00:01 04:23:59 4318 $638.80 Total amount: $638.80//注意 题目的读入是 月:天:时:分 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<stack> #include<map> using namespace std; typedef long long ll; const int maxn=1005; const int inf=9999; const int num_cost=24; int cost[num_cost]; struct bill {char name[50];//姓名char flag[50];//电话的状态int month;//月int ttint time;int h,m,s;//天 时 分 (用了h,m,s因为开始以为是时:分:秒,后来发现看错了)// int ok;///1 is on-line }p[maxn]; bool cmp(bill a,bill b)//先进行排序处理,然后直接可以枚举了 {if(strcmp(a.name,b.name))return strcmp(a.name,b.name)<0;elsereturn a.time<b.time; } double diff(bill a,bill b)//费用的计算 我是把他们化为整数的天,先去掉开始,结束的零头,最后在按整天的计算,因为每个小时的收费不一样 {double ans=0;ans-=cost[a.m]*a.s;int t=a.m-1;while(t>=0){ans-=cost[t]*60;t--;}ans+=cost[b.m]*b.s;t=b.m-1;while(t>=0){ans+=cost[t]*60;t--;}while(a.h<b.h){for(int i=0;i<24;i++)ans+=cost[i]*60;a.h++;}ans/=100;printf(" $%.2lf\n",ans);return ans; }int main() {int n,m,i,j,t;for(i=0;i<num_cost;i++)scanf("%d",&cost[i]);scanf("%d",&n);for(i=0;i<n;i++){int h,m,s;scanf("%s %d:%d:%d:%d %s",p[i].name,&p[i].month,&h,&m,&s,p[i].flag);p[i].time=h*24*60+m*60+s;p[i].h=h;p[i].m=m;p[i].s=s;//p[i].ok=strcmp("on-line",p[i].flag)==0?1:0;}sort(p,p+n,cmp);// for(i=0;i<n;i++)// cout<<p[i].name<<' '<<p[i].month<<' '<<p[i].time<<' '<<p[i].flag<<endl;char tmp[50];// strcpy(tmp,p[0].name);double total=0;int ok=1;for(i=1;i<n;i++,ok++){int ok=0;if(!strcmp(p[i-1].name,p[i].name)&&!strcmp(p[i-1].flag,"on-line")&&!strcmp("off-line",p[i].flag)){if(strcmp(tmp,p[i].name)){strcpy(tmp,p[i].name);if(total)printf("Total amount: $%.2lf\n",total);total=0;printf("%s %02d\n",p[i].name,p[i].month);ok=0;}printf("%02d:%02d:%02d %02d:%02d:%02d %d",p[i-1].h,p[i-1].m,p[i-1].s,p[i].h,p[i].m,p[i].s,(p[i].time-p[i-1].time));total+=diff(p[i-1],p[i]);}}printf("Total amount: $%.2lf\n",total);return 0; }
这篇关于1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!