从我原来的博客上搬运。原先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. Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift(BN)

    internal covariate shift(ics):训练深度神经网络是复杂的,因为在训练过程中,每层的输入分布会随着之前层的参数变化而发生变化.所以训练需要更小的学习速度和careful参数初 ...

  2. Idea 配置 Database 组件的MySql数据库连接

    1.选择MySql

  3. WPF学习笔记(7):DataGrid中数字自定义格式显示

    DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1)所有数据保留两位小数:(2)超过1000的数字显示千分位:(3)如果数据为0,不显示. 首先想到用StringFormat进 ...

  4. Git免密码提交

    下面说一下https克隆的方式免密码提交 在我们下载链接前面加上账号:密码@即可 方式一: 使用https的方式克隆代码 git clone '地址' 查看项目中的配置文件 vim .git/conf ...

  5. datagrid中设置编辑,删除列是否可以访问

    foreach (RepeaterItem Item in rpt_Result.Items) { LinkButton edit = (LinkButton)Item.FindControl(&qu ...

  6. iOS 通用缓存:HanekeSwift

    iOS 通用缓存:HanekeSwift Haneke 是个采用 Swift 编写的轻量级 iOS 通用缓存.示例: 初始化一个数据缓存: let cache = Cache<NSData> ...

  7. windows10安装mysql8.0.11(免安装版)

    1.MySQL8.0.11下载网址:https://dev.mysql.com/downloads/mysql/ 2.配置环境变量:我的电脑->属性->高级系统设置->环境变量-&g ...

  8. Cygwin安装篇,windows平台上运行的类UNIX模拟环境

    1.虚拟光驱的安装 虚拟光驱下载 一路下一步,不再阐述,这些广告选项不要选 2.安装文档,双击ISO文档 ISO下载地址 链接:http://pan.baidu.com/s/1miFVCYO 密码:z ...

  9. Hello,移动WEB—Viewport_Meta标签

    二   Viewport meta标签: 语法:<meta name="viewport" content="name=value, name=value" ...

  10. Git----使用WebHook实现代码自动部署

    起因: 经常本地push到gitee等线上代码仓库,然后登陆服务器在进行pull,很麻烦,想偷懒怎么办?使用git的webhook实现! 1.实现原理 1.1本地提交推送 1.2线上仓库监听push动 ...