1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用)

2024-08-30 21:18

本文主要是介绍1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1016. Phone Bills (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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-line
Sample 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) 模拟(就是很繁琐 尤其是计算费用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121958

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为