PAT

PAT1016 Phone Bills

题目描述带坑

Posted by canjuly on August 29, 2018

题目链接

题目大意

description

有一堆记录,记录包括了通话人、通话时间和状态。状态分为上线(on-line)和下线(off-line)相邻的一次上线和一次下线可以组成一次完整的通话记录。在一天中每个小时的通花费用是不同的,现在给你每个小时的费用,让你按格式输出通话人、月份、通话记录、通话时间和通话费用等信息。

思路

inspration

没有算法的水题,直接vector存名字,拿一个vector数组存某个人所有的记录,再拿map存名字到数组下标的对应关系。然后存名字的vector去sort一下,存记录的每个vector去sort一下就可以基本搞定格式了。算费用我是拿通话开始时间减每个月的1日0点0分作为起点算出费用c1,通话结束时间减每个月的1日0点0分作为起点算出费用c2,c2-c1就是实际的花费了,时间也是这么算。

本来算时间想o(1)去搞搞,拿个数组记录前缀和啥的。。后来有个小问题懒得搞了直接暴力算。

坑点

pit

这道题我敲好一交是个wa,看了一边代码感觉没毛病,估计是题目有细节没看着。我第一反应是估计如果有某个人名字的记录但是没有有效的通话记录,那么这个人的所有信息都是不输出的。我就又去看了一遍题,发现没有这个说法(哪有这种事!!!)于时去看了下题解,发现自己还真猜对了。。因为懒得保存输出结果就多加了一层for循环去判断这种情况,交了之后轻松AC。

代码

括号换行,又臭又长

#include <iostream>  
#include <cstdio>  
#include <cmath>  
#include <cstdlib>  
#include <cstring>  
#include <string>  
#include <algorithm>  
#include <vector>  
#include <queue>  
#include <map>  
#define ll long long  
using namespace std;  

const int INF = 0x3f3f3f3f;
map<string,int>mmp;
vector<string>names;
int cost[30];
struct node
{
	string name;
	int day;
	int hour;
	int minute;
	string time;
	string sta;
}; 
vector<node>num[1002];
bool cmp(node a,node b)
{
	return a.day*10000+a.hour*100+a.minute<b.day*10000+b.hour*100+b.minute;
}
double cal_money(node a)
{
	double sum = 0;
	for(int i=0;i<24;i++)
		sum+=60*cost[i];
	sum=sum*(a.day-1);
	for(int i=0;i<a.hour;i++)
		sum+=60*cost[i];
	sum+=cost[a.hour]*a.minute;
	return sum/100.0;
}
int main()
{
	
	for(int i=0;i<24;i++)
	{
		scanf("%d",&cost[i]);
	}
	string month;
	int n,cnt=0;
	scanf("%d",&n);
	while(n--)
	{
		string name,time,sta;
		cin>>name>>time>>sta;
		if(!mmp.count(name))
		{
			mmp[name]=cnt;cnt++;
			names.push_back(name);
		}
		month = time.substr(0,2);
		node temp;
		temp.name = name;
		temp.day = (time[3]-'0')*10+time[4]-'0';
		temp.hour = (time[6]-'0')*10+time[7]-'0';
		temp.minute = (time[9]-'0')*10+time[10]-'0';
		temp.time = time.substr(3,8);
		temp.sta = sta;
		num[mmp[name]].push_back(temp);
	}
	sort(names.begin(),names.end());
	for(int i=0;i<cnt;i++)
	{
		int now = mmp[names[i]];
		double amount = 0;
		sort(num[now].begin(),num[now].end(),cmp);
		int flag=0;
		for(int j=0;j<num[now].size()-1;j++)
		{
			if(num[now][j].sta=="on-line"&&num[now][j+1].sta=="off-line")
			{
				flag=1;break;
			}
		}
		if(!flag)
			continue;
		cout<<names[i]<<" "<<month<<"\n";
		for(int j=0;j<num[now].size() - 1;j++)
		{
			if(num[now][j].sta=="on-line"&&num[now][j+1].sta=="off-line")
			{
				cout<<num[now][j].time<<" "<<num[now][j+1].time<<" ";
				printf("%d ",(num[now][j+1].day-1)*24*60+num[now][j+1].hour*60+num[now][j+1].minute
				- (num[now][j].day-1)*24*60-num[now][j].hour*60-num[now][j].minute);
				double d1 = cal_money(num[now][j+1]);
				double d2 = cal_money(num[now][j]);
				printf("$%.2lf\n",d1-d2);
				j++;
				amount+=d1-d2;
			}
		}
		printf("Total amount: $%.2lf\n",amount);
	}
	return 0;
}