#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. codevs1099 字串变换

    题目描述 Description 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ ...

  2. python中实现将普通字典dict转换为java中的treeMap

    上代码: from heapq import heappush,heappop from collections import OrderedDict def toTreeMap(paramMap): ...

  3. 定义Portal显示规则

    Defining Portal Display Rules Use You use the Portal Display Rules editor to create and edit rule co ...

  4. 18、Java并发性和多线程-饥饿与公平

    以下内容转自http://ifeve.com/starvation-and-fairness/: 如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”.而该线程 ...

  5. Unity uGui RawImage 渲染小地图

    制作类似 RPG 游戏时,可能会须要显示小地图. 小地图的制作一种方式是用还有一个摄像机来渲染到一张纹理上.实时显示到UI界面. 以Unity 5.0 的 UI 系统为例: 在地图正上方放置一个摄像机 ...

  6. 从零单排入门机器学习:Octave/matlab的经常使用知识之矩阵和向量

    Octave/matlab的经常使用知识之矩阵和向量 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错.算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一 ...

  7. POJ 1861 Network (Kruskal求MST模板题)

    Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14103   Accepted: 5528   Specia ...

  8. 「五」创建一个带 tomcat 服务的基础镜像(修订版)

    Tomcat Tomcat 简单介绍 Tomcat server是一个免费的开放源码的Web 应用server,属于轻量级应用server.在中小型系统和并发訪问用户不是非常多的场合下被普遍使用,是开 ...

  9. Wcf配置log4net

    1.引用log4net dll文件 2.创建log4net.config文件并配置文件信息 <?xml version="1.0" encoding="utf-8& ...

  10. CocoaPods 的安装和使用介绍

    CocoaPods 的安装和使用介绍 安装 安装方式异常简单 , Mac 下都自带 ruby,使用 ruby 的 gem 命令即可下载安装: 1 2 $ sudo gem install cocoap ...