从我原来的博客上搬运。原先blog作废。

题目

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.

题解

繁琐,但是不难。合理运用封装能够减少代码量。

剩下的是两个注意事项:1.是连续的on-off算作一个记录。一个例子:

01 on 02 on 03 off 04 off 那么02-03算作一个记录。

2.必须要注意这个情况,就是如果没有合法的记录的话就不打印账单!!!不论是一开始的还是tot Amount!我第二个一开始忘了不打印了!!

以上。

代码

#include <bits/stdc++.h>
using namespace std; #define f1(x,y) for(int x=1;x<=y;++x)
#define f0(x,y) for(int x=0;x!=y;++x)
#define bf1(x,y,z) for(int x=y;x>=z;--x)
#define bf0(x,y,z) for(int x=y;x!=z;--x)
typedef long long ll;
typedef unsigned long long ull;
int fee[25];
int ohrfee[25]={0};//fee of 00:00~i:00
int dayfee=0;
struct Record
{
int month;
int recMin;
bool isOn;
Record(int _m=1,int _r=0,bool _o=true):
month(_m),recMin(_r),isOn(_o)
{}
bool operator < (const Record& rhs) const
{
return recMin<rhs.recMin;
}
};
typedef pair<Record,Record> Call;
struct User
{
string name;
int month;
vector<Record> rec;
vector<Call> cal;
User(string _n):name(_n) {}
void calc()
{
sort(rec.begin(),rec.end());
int marked[1005];
memset(marked,-1,sizeof(marked));
month=rec[0].month;
bool isOk=false;
f0(i,rec.size()) if(rec[i].isOn && i+1<rec.size() && !(rec[i+1].isOn))
{
cal.push_back(make_pair(rec[i],rec[i+1]));
}
return;
}
};
vector<User> u;
map<string,int> idx;
int main()
{
int f;
f0(i,24)
{
scanf("%d",&f);
fee[i]=f;
if(i==0) ohrfee[i]=0;
else ohrfee[i]=ohrfee[i-1]+fee[i-1]*60;
dayfee+=fee[i]*60;
}
int n; scanf("%d",&n);
f1(i,n)
{
char name[25],status[10];
int mon,d,h,minute;
scanf("%s %d:%d:%d:%d %s",name,&mon,&d,&h,&minute,status);
if(idx.find(string(name))==idx.end())
{
u.push_back(User(string(name)));
idx[string(name)]=u.size()-1;
u.back().rec.push_back(Record(mon,d*1440+h*60+minute,status[1]=='n'));
}
else u[idx[string(name)]].rec.push_back(Record(mon,d*1440+h*60+minute,status[1]=='n'));
}
for(auto iter=u.begin();iter!=u.end();++iter) iter->calc();
for(auto iter=idx.begin();iter!=idx.end();++iter)
{
int num=iter->second;
string nam=iter->first;
User& usr=u[num];
vector<Call>& c=usr.cal;
if(c.size()!=0) printf("%s %02d\n",nam.c_str(),usr.month);
int tot=0;//100cents->1$
f0(i,c.size())
{
int fd,fh,fm,sd,sh,sm,cost;
fd=c[i].first.recMin/1440;fh=(c[i].first.recMin%1440)/60;fm=(c[i].first.recMin%60);
sd=c[i].second.recMin/1440;sh=(c[i].second.recMin%1440)/60;sm=(c[i].second.recMin%60);
cost=(sd-fd)*dayfee+(ohrfee[sh]+sm*fee[sh])-(ohrfee[fh]+fm*fee[fh]);
//printf("2:ohrfee[%d]=%d,sm=%d,fee[%d]=%d.\n",sh,ohrfee[sh],sm,sh,fee[sh]);
//printf("1:ohrfee[%d]=%d,sm=%d,fee[%d]=%d.\n",fh,ohrfee[fh],fm,fh,fee[fh]);
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",fd,fh,fm,
sd,sh,sm,
c[i].second.recMin-c[i].first.recMin,cost/100.0);
tot+=cost;
}
if(c.size()!=0) printf("Total amount: $%.2f\n",tot/100.0);
}
return 0;
}

【题解搬运】PAT_A1016 Phone Bills的更多相关文章

  1. PAT_A1016#Phone Bills

    Source: PAT A1016 Phone Bills (25 分) Description: A long-distance telephone company charges its cust ...

  2. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

  3. 【题解搬运】PAT_A1020 树的遍历

    题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...

  4. 【BZOJ】【2463】【中山市选2009】谁能赢呢?

    博弈论 这能算博弈论吗…… orz ZYF so sad……窝智商太低 题解搬运: 当n为偶数时,可以被2*1的骨牌完全覆盖,所以每次都走骨牌的另一端,而另一个人只能走新的骨牌,直到没有为止 当n为奇 ...

  5. codevs 3044 矩形面积求并 (扫描线)

    /* 之前一直偷懒离散化+暴力做着题 今天搞一下扫描线 自己按照线段树的一般写法写的有些问题 因为不用于以前的区间sum so 题解搬运者23333 Orz~ 去掉了打标记的过程 同时更新区间的时候先 ...

  6. 「2017 Multi-University Training Contest 1」2017多校训练1

    1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...

  7. 【SRM-05 B】无题?

    Description 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城市之间有边直接相连,则称这种情况是坏的.现在并 ...

  8. Codeforces 1188E - Problem from Red Panda(找性质+组合数学)

    Codeforces 题面传送门 & 洛谷题面传送门 咦,题解搬运人竟是我? 一道很毒的计数题. 先转化下题意,每一次操作我们可以视作选择一种颜色并将其出现次数 \(+k\),之后将所有颜色的 ...

  9. 洛谷 P4708 - 画画(Burnside 引理+组合数学)

    洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...

随机推荐

  1. 一、安装 IntelliJ IDEA

    首先,双击打开 IntelliJ IDEA 的快捷方式: 在此,需要说明: 如果咱们的电脑曾经安装过 IntelliJ IDEA,并且你在卸载 IntelliJ IDEA 的时候没有删除其配置文件目录 ...

  2. Hive中使用LZO

    hive 中使用lzo 1 启动hive 错误Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  3. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

  4. 在Win7虚拟机下搭建Hadoop2.6.0+Spark1.4.0单机环境

    Hadoop的安装和配置可以参考我之前的文章:在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境. 本篇介绍如何在Hadoop2.6.0基础上搭建spark1.4.0单机环境. 1. 软件准备 ...

  5. Angularjs基础(九)

    AngularJS 应用应用程序讲解 实例: <html ng-app="myNoteApp"> <head> <meat charset=" ...

  6. git简单配置

    1.安装完git查看版本 git --version 2.配置用户名邮箱 git config --global user.name "chencheng" git config ...

  7. [USACO1.5]数字三角形 Number Triangles

    题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...

  8. dom4j解析器sax解析xml文件

    1.使用dom4j解析器解析xml ***解析器dom4j是由dom4j组织提供的,针对xml进行解析.dom4j不是Javase的一部分,使用时需要导入dom4j的jar包(官网下载) 在eclip ...

  9. sklearn fit transform fit_transform

    scikit-learn提供了一系列转换库,他们可以清洗,降维,提取特征等. 在数据转换中有三个很重要的方法,fit,fit_transform,transform ss=StandardScaler ...

  10. 堆数据结构(heapq)简单应用

    ## 堆数据结构(heapq)简单应用 # 堆数据结构 heapq # 常用方法:nlargest(),nsmallest(),heapify(),heappop() # 如果需要的个数较小,使用nl ...