Phone Bills(内含知识点总结)

题目

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<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct nodes{
	string name;
	int month,day,hour,minute,time,status;
};
bool cmp(nodes a,nodes b)
{
	return a.name==b.name?a.time<b.time:a.name<b.name;
}
double bill(nodes tmp,int rate[])
{
	double total=rate[tmp.hour]*tmp.minute+rate[24]*60*tmp.day;
	for(int i=0;i<tmp.hour;i++)
	{
		total+=rate[i]*60;
	}
	return total/100.0;
}

int main()
{
	int rate[25]={0};//初始化为0必须要有,否则在计算rate[24]时,它的初始值就是随机的
	for(int i=0;i<24;i++)
	{
		cin>>rate[i];
		rate[24]+=rate[i];
    } 
    int n;
    cin>>n;
    vector<nodes> data(n);
    for(int i=0;i<n;i++)
    {
    	cin>>data[i].name;
    	scanf("%d:%d:%d:%d",&data[i].month,&data[i].day,&data[i].hour,&data[i].minute);
    	string temp;
    	cin>>temp;
    	data[i].status=(temp=="on-line")?1:0;
    	data[i].time=data[i].day*24*60+data[i].hour*60+data[i].minute;
	}
	sort(data.begin(),data.end(),cmp);
	map<string,vector<nodes> > maps;
	for(int i=1;i<n;i++)
	{
		if(data[i].name==data[i-1].name&&data[i].status==0&&data[i-1].status==1)
		{
			maps[data[i-1].name].push_back(data[i-1]);
			maps[data[i].name].push_back(data[i]);
		}
	}
	for(map<string,vector<nodes> >::iterator it=maps.begin();it!=maps.end();it++)
	{
		cout<<it->first;
		vector<nodes> tmp=it->second;
		printf(" %02d\n",tmp[0].month);
		double total=0.0f;
		for(int i=1;i<tmp.size();i+=2)
		{
			double t=bill(tmp[i],rate)-bill(tmp[i-1],rate);
			printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute,tmp[i].day,tmp[i].hour,tmp[i].minute,tmp[i].time-tmp[i-1].time,t);
			total += t;
		}
		printf("Total amount: $%.2f\n",total);
	}
}

参考

Phone Bills (25)

里面有很详细的思路讲解,推荐大家进去看看,这篇文章主要是为大家总结知识点来供大家参考

知识点总结

  1. 通过cmp函数自定义sort的排序方式,使用方法就是在sort的第三个参数上放入cmp
  2. 变量及数组的初始化,本题如果不初始化为0,那么在计算rate[24]时,所得的数可能非常大,这是因为编译器将其处置设置为了一个随机整数而非0
  3. 第一点提到了sort排序,那么大家知道如何对vector,string这类的变量排序吗?答案就是使用begin和end
  4. 我们平时使用map时,通常都是1对1的使用,但如果将第二个参数改为vector、数组等,就能实现一对多的映射关系,本题便是如此。在创建map变量后,要学会如何赋值——maps[data[i-1].name].push_back(data[i-1]);
  5. 你知道0.0f是什么吗?简单来说就是和0.0相比更安全,详情可见这篇文章——C语言0和0.0f的区别
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值