#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的更多相关文章

  1. PAT甲级1016. Phone Bills

    PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...

  2. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  3. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  4. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  5. PAT甲级1127. ZigZagging on a Tree

    PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...

  6. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  7. PAT甲级1119. Pre- and Post-order Traversals

    PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...

  8. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

  9. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

随机推荐

  1. 用xshell5连接虚拟机,显示Could not connect to '192.168.3.128' (port 22): Connection failed.

    原因:虚拟机上没有安装或者没有启动ssh 解决: 1.安装sshserver sudo apt-get install openssh-server 2.启动ssh服务 sudo service ss ...

  2. TCP/IP协议1

    1.分层 应用层 telent 远程登录,ftp 文件传输协议,smtp 简单邮件传送协议 snmp 简单网络管理协议 email 运输层  tcp(提供可靠的数据通信)和udp(数据报的分组从一台主 ...

  3. 武大OJ 622. Symmetrical

    Description          Cyy likes something symmetrical, and Han Move likes something circular. Han Mov ...

  4. css3 transform对其他样式影响,(尤其是position:flixed)

    1.transform 会为当前元素添加 position : relative 特性: 当 magin 为负值的时候,就会覆盖到前面的 元素, 然而如果给前面元素添加了transform 属性后,前 ...

  5. FAST_START_MTTR_TARGET

    Release 9i introduced a new parameter, FAST_START_MTTR_TARGET, that makes controlling instance recov ...

  6. 移动智能设备功耗优化系列--前言(NVIDIA资深project师分享)

    本文是嵌入式企鹅圈原创团队成员.NVIDIA资深开发project师Terry发表的第一篇文章,其将对"移动智能设备功耗优化"这个专题展开一个系列的总结分享. Terry毫无保留地 ...

  7. 1.3-动态路由协议RIP①

    Dynamic Routing Protocol:动态路由协议 现代IP网络中,主要的动态路由协议: AD/管理距离: 1:DV/距离向量协议:RIP(120)/IGRP(100) 2:LS/链路状态 ...

  8. struts2前端页面读取Clob/BLOB

    在通过Struts2标签显示对象的Clob属性值的时候.显示的并非CLOB或者BLOB的内容,而是显示的toString方法的值 比如我在实体中的注解为: @Lob @Column(name = &q ...

  9. Java Web开发基础(1)-Servlet

    概述 Servlet技术是对webserver的扩展,要理解这个,可能先了解一下什么是Webserver以及它的功能,特别是它的不足是非常有帮助的,可參考:点击打开链接.另外.Servlet也是一个用 ...

  10. hdu 5950 Recursive sequence

    题意:告诉你数列的递推公式为f(n+1)=f(n)+2*f(n-1)+(n+1)^4 以及前两项a,b:问第n项为多少,结果对2147493647取模. 题解:有递推公式,马上应该就能想到矩阵快速幂: ...