PAT 1016 Phone Bills[转载]
1016 Phone Bills (25)(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-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
//看见这种这么长的题目,都不想看,又是字符串处理和模拟仿真的题目,啊!
输出每月的电话费。每一个测试用例都是在同一月份。
输入:24小时每小时的长途话费单价(美分/分钟)
人名 时间 上线/下线 说明:如果一个on-line没有off-line匹配,那么就忽略,off-line也是如此,
输出:按字典序的人名,月份 使用时间段及每段花费,总费用。
//代码来自:https://blog.csdn.net/ysq96/article/details/80438014
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std; struct customer
{
customer(){
this->month=;
this->dd=;
this->hh=;
this->mm=;
}
string name;//名字
int month,dd,hh,mm;//月 天 时 分
bool status;
}; bool cmp(customer a, customer b){
int x = a.name.compare(b.name);
if(x!=){
return x<;//首先按照名字字母排序
}else if(a.month!=b.month)
{//再按照月份排序
return a.month<b.month;
}else if (a.dd!=b.dd)
{//再按照号
return a.dd<b.dd;
}else if(a.hh!=b.hh){//再按照小时
return a.hh<b.hh;
}else
{//再按照分钟
return a.mm<b.mm;
}
}
int prize[];
double get_ans(customer a, customer b,int& time){
int money=;
while (a.dd>b.dd||a.hh>b.hh||a.mm>b.mm)
{
time++;
money+=prize[b.hh];
b.mm++;
if (b.mm>=)
{
b.mm=;
b.hh++;
}
if (b.hh>=)
{
b.hh=;
b.dd++;
}
}
return money/100.0;
}
int main(){
for (int i=;i<;i++)
{
cin>>prize[i];
}
int n;
string name,status;
int month,dd,hh,mm;
cin>>n;
vector<customer> data(n);
for(int i=;i<n;i++){
cin>>name;
scanf("%d:%d:%d:%d",&month,&dd,&hh,&mm);//可以这样按照格式输入!,那就不用处理字符串了!
cin>>status;
data[i].name=name;
data[i].month=month;
data[i].dd=dd;
data[i].hh=hh;
data[i].mm=mm;
if(status.compare("on-line")==){
data[i].status=true;//开始标记为true;
}else
{
data[i].status=false;
}
}
sort(data.begin(),data.end(),cmp);
//先读取第一个人
customer temp;
temp=data[];
int on=-,off;
bool flag=false;
if (temp.status)
{
on=;
}
double total=0.0;
for (int i=;i<n;i++)
{ if (data[i].name.compare(temp.name)==)//若此数据名字和上一个数据相同
{
if (data[i].status)
{
on=i;//记录on下标
}else
{
off=i;//记录off下标
}
if (off==on+)//若此数据为off 上一个数据为on,如果没有符合的话,那么就什么也不输出。
{
if (!flag)
{
cout<<data[i].name<<" ";
printf("%02d\n",data[i].month);//注意这里的输出格式!
flag=true;
}
int time=;
double bills=0.0;
bills=get_ans(data[i],temp,time);
total += bills;
printf("%02d:%02d:%02d %02d:%02d:%02d",temp.dd,temp.hh,temp.mm,data[i].dd,data[i].hh,data[i].mm);
cout<<" "<<time;
printf(" $%.2f\n",bills);
}
}else{
if (flag)
{
printf("Total amount: $%.2f\n",total);
flag=false;
total=0.0;
} }
temp=data[i];
if (data[i].status)
{
on=i;//记录on下标
}else
{
off=i;//记录off下标
}
if (i==n-)
{
if (flag)
{
printf("Total amount: $%.2f\n",total);
}
}
}
return ;
}
//相当厉害!
//经过测试用例表明,如果有多个on,只有一个off,那么就和最接近off的配对。
如果测试用例如下:
CYLL ::: on-line
CYLL ::: on-line
CYLL ::: off-line
CYLL ::: off-line
那么输出:
CYLL
:: :: $0.40
Total amount: $0.40
也就是说,如果有多个,第一个on和最后一个off就不匹配了。按时间排序之后,如果当前是on,下一个还是on,那么当前的on就会被抛弃。
PAT 1016 Phone Bills[转载]的更多相关文章
- PAT 1016 Phone Bills(模拟)
1016. Phone Bills (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A long-di ...
- PAT 1016. Phone Bills
A long-distance telephone company charges its customers by the following rules: Making a long-distan ...
- PAT甲级1016. Phone Bills
PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...
- 1016. Phone Bills (25)——PAT (Advanced Level) Practise
题目信息: 1016. Phone Bills (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A l ...
- PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
- PAT 1016
1016. Phone Bills (25) A long-distance telephone company charges its customers by the following rule ...
- 1016 Phone Bills (25 分)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following rul ...
- PAT A 1016. Phone Bills (25)【模拟】
题目:https://www.patest.cn/contests/pat-a-practise/1016 思路:用结构体存储,按照名字和日期排序,然后先判断是否有效,然后输出,时间加减直接暴力即可 ...
- PAT甲题题解-1016. Phone Bills (25)-模拟、排序
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789229.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- python基础---->python的使用(五)
这里记录一些python的一些基础知识,主要内容是高阶函数的使用.或许我的心包有一层硬壳,能破壳而入的东西是极其有限的.所以我才不能对人一往情深. python中的高阶函数 一.map().reduc ...
- MFC 虚函数与消息映射区别
初学MFC添加函数时,总是纠结于是 Add windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理 ...
- Android studio快捷键设置
Android Studio格式化代码设置和代码风格设置.代码提示键 http://blog.csdn.net/u010156024/article/details/48207145 Android ...
- javaweb基础 02--javaweb基础概念
1.WEB资源 * 静态web资源:指web页面中供人们浏览的数据始终是不变(如 html 页面). * 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内 ...
- sencha touch 在线实战培训 第一期 第四节
2014.1.4晚上8点开的课 第一节收费课程,还是有几位同学付费了,这些课程也录像了的,以后也会持续销售. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容: ...
- 使用 udev 管理 Linux 设备文件
本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
- Maven使用tomcat8-maven-plugin插件
在网上搜索一堆文章没找到解决方法,只找到了tomcat7-maven-plugin的plugin,如下: <plugin> <groupId>org.apache.tomcat ...
- SSH教程从零打造在线网盘系统前言&目录
本系列教程内容提要 本系列教程是一个学习教程,是关于Java工程师的SSH(Struts2+Spring+Hibernate)系列教程,本教程将会分为四个部分和大家一同打造一个在线网盘系统,由于教程是 ...
- easyui---基础组件:dialog
依赖下面两个组件 window linkbutton linbutton组件:就是超链接变成按钮 $(function(){ $("#linkbuttonid").linkbutt ...