PAT甲级1016Phone Bills
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<iterator>
using namespace std; #define ONLine ("on-line")
struct Record
{
Record(){};
Record(char *szName,char* szTime,char* szOnline)
{
bOnline = (strcmp(szOnline,ONLine)==);
strName = szName;
strTime = szTime;
}
string strName;
string strTime;
bool bOnline;
};
struct RecordTime
{
string strStartTime;
string strEndTime;
RecordTime(string starttime,string endtime)
{
strStartTime = starttime;
strEndTime = endtime;
}
RecordTime(){}
};
struct MyTime
{
MyTime(){};
MyTime(const char *cTime)
{
dd = *(cTime[]-'')+(cTime[]-'');
hh = *(cTime[]-'')+(cTime[]-'');
mm = *(cTime[]-'')+(cTime[]-'');
iTick = dd**+hh*+mm;
}
int dd;
int hh;
int mm;
int iTick;
};
int iPrice[];
map<string,int> mapRecord;
vector<Record> vcRecord[];
vector<RecordTime> vcDisplay[];
bool Comp(const Record& r1,const Record& r2)
{
return r1.strTime.compare(r2.strTime)<;
}
int getOneDayBill()
{
int iSum = ;
for(int i=;i<;++i)
iSum += (*iPrice[i]);
return iSum;
}
float DisplayOneCall(const RecordTime &rt)
{
string outStartTime = rt.strStartTime.substr(,);
string outEndTime = rt.strEndTime.substr(,);
printf("%s %s ",outStartTime.c_str(),outEndTime.c_str());
MyTime mtime1(outStartTime.c_str()),mtime2(outEndTime.c_str());
int iTotalTime = mtime2.iTick - mtime1.iTick;
float fTatalBill = 0.0f; //计算账单,用每一分钟遍历,可以AC
/*for(int dd=mtime1.dd,hh=mtime1.hh,mm=mtime1.mm;
!(dd==mtime2.dd&&hh==mtime2.hh&&mm==mtime2.mm);)
{
fTatalBill += iPrice[hh];
if(++mm == 60)
{
mm = 0;
++hh;
}
if(hh == 24)
{
hh = 0;
++dd;
}
}
*/
//把中间几个整天提出来,然后剩余的按分钟遍历,可以AC
/*int iDay = iTotalTime/60/24;
fTatalBill += iDay*getOneDayBill();
for(int hh=mtime1.hh,mm=mtime1.mm;
!(hh==mtime2.hh&&mm==mtime2.mm);)
{
fTatalBill += iPrice[hh];
if(++mm == 60) mm = 0,++hh;
if(hh == 24) hh = 0;
}
*/ int iDay = iTotalTime//;
fTatalBill += iDay*getOneDayBill();
if((mtime1.hh > mtime2.hh)
|| (mtime1.hh == mtime2.hh&&(mtime1.mm> mtime2.mm)))
mtime2.hh += ;
if(mtime1.hh == mtime2.hh && mtime2.mm>mtime1.mm)
fTatalBill += iPrice[mtime1.hh]*(mtime2.mm-mtime1.mm);
else
for(int hh = mtime1.hh;hh<=mtime2.hh;++hh)
{
if(hh == mtime1.hh)
fTatalBill += iPrice[hh%]*(-mtime1.mm);
else if(hh == mtime2.hh)
fTatalBill += iPrice[hh%]*(mtime2.mm);
else
fTatalBill += iPrice[hh%]*();
}
fTatalBill = 1.0*fTatalBill/;
printf("%d $%.2f\n",iTotalTime,fTatalBill);
return fTatalBill;
}
int main()
{
for(int i=;i<;++i)
scanf("%d",&iPrice[i]);
int n;
scanf("%d",&n);
int cnt=;
for(int i=;i<n;++i)
{
char szName[],szTime[],szOnline[];
scanf("%s%s%s",szName,szTime,szOnline);
Record record(szName,szTime,szOnline);
if(mapRecord.find(szName)==mapRecord.end())
{
mapRecord[szName] = cnt++;
}
vcRecord[mapRecord[szName]].push_back(record);
}
for(int i=;i<cnt;++i)
{
sort(vcRecord[i].begin(),vcRecord[i].end(),Comp);
int iFindOnLine = -;
for(int j=;j<vcRecord[i].size();++j)
{
if(vcRecord[i][j].bOnline==false && iFindOnLine != -)
{
RecordTime rt(vcRecord[i][iFindOnLine].strTime,
vcRecord[i][j].strTime);
vcDisplay[i].push_back(rt);
iFindOnLine = -;
}
else if(vcRecord[i][j].bOnline)
{
iFindOnLine = j;
}
}
} map<string,int>::iterator it = mapRecord.begin();
for(;it != mapRecord.end();it++)
{
int i = it->second;
if(vcDisplay[i].size()> )
{
string strYue = vcRecord[i][].strTime.substr(,);
printf("%s %s\n",it->first.c_str(),strYue.c_str());
float fSum = ;
for(int j=;j<vcDisplay[i].size();++j)
fSum +=DisplayOneCall(vcDisplay[i][j]);
printf("Total amount: $%.2f\n",fSum);
}
else
{ }
} return ;
}
PAT甲级1016Phone Bills的更多相关文章
- PAT甲级1016. Phone Bills
PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...
- PAT甲级题解(慢慢刷中)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 【转载】【PAT】PAT甲级题型分类整理
最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...
- PAT甲级1131. Subway Map
PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...
- PAT甲级1127. ZigZagging on a Tree
PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...
- PAT甲级1123. Is It a Complete AVL Tree
PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...
- PAT甲级1119. Pre- and Post-order Traversals
PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...
- PAT甲级1114. Family Property
PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...
- PAT甲级1111. Online Map
PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...
随机推荐
- hdu3461
题意描述:有一个类似滚轮式的密码锁放在一排共n个,有m种操作每次操作一个区间,且此次操作后的所有密码相同,问最多能形成多少种密码 解决:将区间分为可变部分和不可变部分,没当有可变部分时候总区间数要减去 ...
- AbstractList 重写 equals() 方法
题目内容 题目内容很简单,就是创建 ArrayList 和 Vector 集合,向两者添加相同内容的字符串,最后用 equals() 方法比较是否相等. 这里就考察了 "==" 和 ...
- 27、Java并发性和多线程-CAS(比较和替换)
以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期 ...
- 用Docker创建Nexus
步骤如下: 1. 创建持久化目录 $ mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data 2. 创建镜像并运 ...
- [LeetCode][Java] 4Sum
题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
题目标签:HashMap 题目给了我们两个句子,让我们找出不常见单词,只出现过一次的单词就是不常见单词. 把A 和 B 里的word 都存入 map,记录它们出现的次数.之后遍历map,把只出现过一次 ...
- 一个MySQL-JDBC驱动bug引起的血案……
问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL ...
- C - The C Answer (2nd Edition) - Exercise 1-15
/* Rewrite the temperature conversion program of Section 1.2 to use a function for conversion. */ #i ...
- 重写description方法
//重写description方法 //description建议大家在实际开发中都要重写这种方法.然后将类中有意义的成员变量打印出来,这样很方便我们调试程序 -(NSString *)descrip ...
- 【bzoj1082】栅栏[SCOI2005]
显然我们取的肯定是前ans块木板.然后砍的木材也应该是从小到大砍(如果小的木材可以满足条件,就一定不会去动大的木材) 所以两遍排序. 二分答案. 然后对于要取的每块木板,我们搜索它是在第x块木板上砍下 ...