题目链接:点击查看

题目大意:模拟电话收费规则:

  1. 每个时间段的收费不同,时间段分为:00:00-01:00,01:00-02:00诸如此类
  2. 最开始给出的单价是每分钟的单价

最后输出每个用户的电话费

题目分析:甲级的题目我就没读明白过,加上漏掉了好多细节,导致前期白费功夫:

  1. 题目保证给出相同的月份
  2. 电话费为0的人不需要输出
  3. 初始时给出的单价是美分,题目要求输出的答案是美元,100美分=1美元

再加上通过分析可以得到的,首先若可以组成配对,则排序后相邻两个的信息中,必须前者是on-line,后者是off-line,关于给出两个时间该怎么求花费,一开始我想推公式,O(1)得到答案,可是发现细枝末节太多了,根本顾不过来,最后还是屈服了,用了时间代价,枚举分钟来实现的,不得不说,暴力牛逼

一个是一开始没读懂题就直接上手做,导致做了很多无用功,还有一个就是能暴力就暴力,别想着乱七八糟的公式和规律了,暴力好理解还好实现,难道他不香吗?

挂代码吧,被恶心到了:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;int cost[25];int sum_cost=0;//所有的花费之和unordered_map<string,bool>vis;//用来记录当前的人是否被访问过struct date//记录时间
{int month;int day,hour,minute;bool operator<(const date& a)const{if(day!=a.day)return day<a.day;if(hour!=a.hour)return hour<a.hour;return minute<a.minute;}
};struct Node//记录每次通话信息
{string name;date time;bool state;bool operator<(const Node& a)const{if(name!=a.name)//先按姓名升序return name<a.name;return time<a.time;//再按时间升序}
}a[N];int   get_sub(date st,date ed)//得到两次时间之差,返回分钟
{int ans1=st.day*24*60+st.hour*60+st.minute;int ans2=ed.day*24*60+ed.hour*60+ed.minute;return abs(ans1-ans2);
}int cal(date st,date ed)//计算两次时间之间的花费,st<=ed
{int d=st.day,h=st.hour,m=st.minute;int dd=ed.day,hh=ed.hour,mm=ed.minute;int ans=0;while(d<dd||h<hh||m<mm){m++;ans+=cost[h];if(m==60){m=0;h++;}if(h==24){h=0;d++;}}return ans;
}int main()
{
//  freopen("input.txt","r",stdin);for(int i=0;i<24;i++){scanf("%d",cost+i);sum_cost+=cost[i];}int n;scanf("%d",&n);for(int i=1;i<=n;i++){cin>>a[i].name;scanf("%d:%d:%d:%d",&a[i].time.month,&a[i].time.day,&a[i].time.hour,&a[i].time.minute);char ss[10];scanf("%s",ss);if(ss[1]=='n')a[i].state=true;elsea[i].state=false;}sort(a+1,a+1+n);int sum=0;for(int i=2;i<=n;i++){if(a[i].name==a[i-1].name&&!a[i].state&&a[i-1].state)//同一个人,并且前一个是on,后一个是off{if(!vis[a[i-1].name])//如果没输出过,输出姓名{printf("%s %02d\n",a[i-1].name.c_str(),a[i-1].time.month);//第一次打印姓名vis[a[i-1].name]=true; }int money=cal(a[i-1].time,a[i].time);sum+=money;date st=a[i-1].time;date ed=a[i].time;printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",st.day,st.hour,st.minute,ed.day,ed.hour,ed.minute,get_sub(st,ed),1.0*money/100);}if((i==n||a[i].name!=a[i+1].name)&&sum!=0)//sum为0时不必输出{printf("Total amount: $%.2f\n",1.0*sum/100);sum=0;}}return 0;
}

PAT (Advanced Level) 1016 Phone Bills(恶心模拟)相关推荐

  1. PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA

    1140 Look-and-say Sequence(20 分) 题意:观察序列D, D1, D111, D113, D11231, D112213111, ...,显然后一个串是对前一个串每一小段连 ...

  2. PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

    1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No. 分析:当A*B为0的时候,不能被Z整除,输 ...

  3. PAT (Advanced Level) 1017 Queueing at Bank(模拟)

    题目链接:点击查看 题目大意:模拟银行服务的过程,输出每个客户的平均等待时间 题目分析:类似的银行服务模拟题,不过与之前那个题不太一样的是,这一次所需要统计的信息变少了,只需要统计一下每个客户的平均等 ...

  4. PAT (Advanced Level) 1014 Waiting in Line(模拟)

    题目链接:点击查看 题目大意:给出规则,要求模拟客户到银行办理手续的过程:为了方便描述,下面将分为等待区和服务区来称呼 银行共有n个窗口,每个窗口最多可以有m个人排队,这里我们称为服务区 若窗口排队人 ...

  5. PAT (Advanced Level) Practice 题解代码 - II (1051-1100)

    PAT PAT (Advanced Level) Practice - II(1051-1100) -------------------------------------------------- ...

  6. PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642

    PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642 题目描述: A Binary Search Tr ...

  7. PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642 题目描述: With the 2010 FIFA World Cu ...

  8. PAT (Advanced Level) 1010 Radix(二分+模拟)

    题目链接:点击查看 题目大意:给出两个数n1和n2,再给出其中一个数的进制,问另一个数能否选择一个进制,使得两个数的值相等 题目分析:首先这个题目一开始会错意了,因为题中的表示只给出了0~9以及a~z ...

  9. PAT (Basic Level) 1075 链表元素分类(模拟)

    题目链接:点击查看 题目大意:初始时给出一个链表,需要按照要求排序: 当结点中的值为负数时,需要排在最前面 当结点中的值为非负数且小于阈值k时,排在中间 当结点中的值大于阈值k时,排在最后 在整体排序 ...

最新文章

  1. 聚焦五大领域:浙江大学发布《重大领域交叉前沿方向2021》报告
  2. php 下 html5 XHR2 + FormData + File API 上传文件
  3. 经典C语言程序100例之十九
  4. intellij2018使用2019的主题
  5. 交换机开发(二)—— 三层交换机报文转发过程
  6. mysql新增范围之外数据_mysql第二天 数据的增删改查补充及外键
  7. 前端:JS/35/二级联动菜单,select对象,select对象的属性,option对象,option对象属性,实例:省份列表与城市列表的联动
  8. C#中ManualResetEvent用法总结
  9. 递归实现从1加到100
  10. 整洁面向对象分层架构 (Clean Object-Oriented and Layered Architecture)
  11. ubuntu中ping停不下来的解决
  12. Flash应用之百宝箱
  13. 常用设计模式的代码实战教程
  14. DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (xxx.xxx.com)\n 报错解决
  15. WebIM 即时通信
  16. 流量消费透明化成为运营商新课题
  17. mysql 主从备份_mysql 主从备份(一)
  18. Salesforce 能依靠Einstein在人工智能领域“突破重围”吗?
  19. 给IDA7.0的python2.7安装模块库
  20. UEFI 开发学习 - LVGL在EDK2上的移植

热门文章

  1. MyBatis的插入数据操作
  2. Collection集合常用功能
  3. 权限操作-springSecurity快速入门
  4. 图的定义存储和遍历(一级)
  5. 设计模式之_Iterator_05
  6. linux zip 开源工程,7-Zip 18.06 发布,开源数据压缩程序
  7. 把数据存入excel文件_Python从原Excel表中抽出数据存入同一文件的新的Sheet(实例53)...
  8. 把手机刷成服务器系统,旧手机改成云服务器
  9. java cmd找不到文件_cmd中输入java找不到文件解决方法
  10. 5.7.22mysql charset_Mysql5.7.22 坑爹的 `character_set_database`