1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用)

2024-08-30 21:18

本文主要是介绍1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1016. Phone Bills (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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.

Input Specification:

Each input file contains one test case. Each case has two parts: the rate structure, and the phone call records.

The rate structure consists of a line with 24 non-negative integers denoting the toll (cents/minute) from 00:00 - 01:00, the toll from 01:00 - 02:00, and so on for each hour in the day.

The next line contains a positive number N (<= 1000), followed by N lines of records. Each phone call record consists of the name of the customer (string of up to 20 characters without space), the time and date (mm:dd:hh:mm), and the word "on-line" or "off-line".

For each test case, all dates will be within a single month. Each "on-line" record is paired with the chronologically next record for the same customer provided it is an "off-line" record. Any "on-line" records that are not paired with an "off-line" record are ignored, as are "off-line" records not paired with an "on-line" record. It is guaranteed that at least one call is well paired in the input. You may assume that no two records for the same customer have the same time. Times are recorded using a 24-hour clock.

Output Specification:

For each test case, you must print a phone bill for each customer.

Bills must be printed in alphabetical order of customers' names. For each customer, first print in a line the name of the customer and the month of the bill in the format shown by the sample. Then for each time period of a call, print in one line the beginning and ending time and date (dd:hh:mm), the lasting time (in minute) and the charge of the call. The calls must be listed in chronological order. Finally, print the total charge for the month in the format shown by the sample.

Sample Input:
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
CYLL 01:01:06:01 on-line
CYLL 01:28:16:05 off-line
CYJJ 01:01:07:00 off-line
CYLL 01:01:08:03 off-line
CYJJ 01:01:05:59 on-line
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
CYLL 01:28:15:41 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line
Sample Output:
CYJJ 01
01:05:59 01:07:00 61 $12.10
Total amount: $12.10
CYLL 01
01:06:01 01:08:03 122 $24.40
28:15:41 28:16:05 24 $3.85
Total amount: $28.25
aaa 01
02:00:01 04:23:59 4318 $638.80
Total amount: $638.80
//注意 题目的读入是 月:天:时:分
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=1005;
const int inf=9999;
const int num_cost=24;
int cost[num_cost];
struct bill
{char name[50];//姓名char flag[50];//电话的状态int month;//月int ttint  time;int h,m,s;//天 时 分  (用了h,m,s因为开始以为是时:分:秒,后来发现看错了)// int ok;///1 is on-line
}p[maxn];
bool cmp(bill a,bill b)//先进行排序处理,然后直接可以枚举了
{if(strcmp(a.name,b.name))return strcmp(a.name,b.name)<0;elsereturn a.time<b.time;
}
double diff(bill a,bill b)//费用的计算  我是把他们化为整数的天,先去掉开始,结束的零头,最后在按整天的计算,因为每个小时的收费不一样
{double ans=0;ans-=cost[a.m]*a.s;int t=a.m-1;while(t>=0){ans-=cost[t]*60;t--;}ans+=cost[b.m]*b.s;t=b.m-1;while(t>=0){ans+=cost[t]*60;t--;}while(a.h<b.h){for(int i=0;i<24;i++)ans+=cost[i]*60;a.h++;}ans/=100;printf(" $%.2lf\n",ans);return ans;
}int main()
{int n,m,i,j,t;for(i=0;i<num_cost;i++)scanf("%d",&cost[i]);scanf("%d",&n);for(i=0;i<n;i++){int h,m,s;scanf("%s %d:%d:%d:%d %s",p[i].name,&p[i].month,&h,&m,&s,p[i].flag);p[i].time=h*24*60+m*60+s;p[i].h=h;p[i].m=m;p[i].s=s;//p[i].ok=strcmp("on-line",p[i].flag)==0?1:0;}sort(p,p+n,cmp);// for(i=0;i<n;i++)//  cout<<p[i].name<<' '<<p[i].month<<' '<<p[i].time<<' '<<p[i].flag<<endl;char tmp[50];// strcpy(tmp,p[0].name);double total=0;int ok=1;for(i=1;i<n;i++,ok++){int ok=0;if(!strcmp(p[i-1].name,p[i].name)&&!strcmp(p[i-1].flag,"on-line")&&!strcmp("off-line",p[i].flag)){if(strcmp(tmp,p[i].name)){strcpy(tmp,p[i].name);if(total)printf("Total amount: $%.2lf\n",total);total=0;printf("%s %02d\n",p[i].name,p[i].month);ok=0;}printf("%02d:%02d:%02d %02d:%02d:%02d %d",p[i-1].h,p[i-1].m,p[i-1].s,p[i].h,p[i].m,p[i].s,(p[i].time-p[i-1].time));total+=diff(p[i-1],p[i]);}}printf("Total amount: $%.2lf\n",total);return 0;
}



 

这篇关于1016. Phone Bills (25) 模拟(就是很繁琐 尤其是计算费用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121958

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效