从我原来的博客上搬运。原先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. 【luogu P3709 大爷的字符串题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...

  2. Android学习笔记_38_图片的拖动、缩放功能和多点触摸

    一.基础知识: 引用 理论上 Android可以处理 多达256 个手指的触摸,大概只有章鱼哥能享受这种技术带来的便利.就编程人员来说,编写多点触摸和单点触摸的方式几乎一模一样.其奥秘在于Motion ...

  3. swift计算label动态宽度和高度

    swift计算label动态宽度和高度 func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let ...

  4. foreach, for in, for of 之间的异同

    forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. 示例代码: var arr = [4, 9, 16, 25]; ...

  5. bzoj2982: combination(lucas)

    Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案 ...

  6. leetcode笔记(八)263. Ugly Number

    题目描述 Write a program to check whether a given number is an ugly number. Ugly numbers are positive nu ...

  7. 用户交互input

    input() 函数 接收到的都是str,如果输入为数字,打印结果想进行运算,此时需要转义.语法:内容=input("提示信息")这里可以直接获取到用户输入的内容. a = inp ...

  8. bootstrap模态框传值操作

    1.bootstrap模态框之html代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"& ...

  9. 使用Ansible实现nginx+keepalived高可用负载均衡自动化部署

    本篇文章记录通过Ansible自动化部署nginx的负载均衡高可用,前端代理使用nginx+keepalived,端web server使用3台nginx用于负载效果的体现,结构图如下: 部署前准备工 ...

  10. Vue插槽 slot

    1. 什么是插槽 插槽slot 是往父组件中插入额外内容,实现组件的复用,一个插槽插入到一个对应的标签中 2. 实例: 一个组件中不允许有两个匿名插槽 </head> <body&g ...