【PAT 甲级】A1016 Phone Bills (25分)

【恶心的模拟题】
必须细心,否则很难AC,可以看看这位总结的测试点,非常好用,帮我挑出来一处错误。

#include <bits/stdc++.h>
using namespace std;
int toll[24];
int dayCost=0;
map<string,int> m;
struct node
{
	bool online;
	string time;
};
vector<node> v[1024];
bool cmp(node a,node b)
{
	for(int i=0;i<11;i++)
	{
		if(a.time[i]==b.time[i])
		continue;
		else if(a.time[i]<b.time[i])
		return true;
		else return false;
	}
}
int convert(char a,char b)
{
	return (a-'0')*10+(b-'0');
}
int print(string a,string b)
{
	int sum=0,cent=0;
	int ad=convert(a[3],a[4]),ah=convert(a[6],a[7]),am=convert(a[9],a[10]);
	int bd=convert(b[3],b[4]),bh=convert(b[6],b[7]),bm=convert(b[9],b[10]);
	sum=(bd-ad)*24*60+(bh-ah)*60+bm-am;
	cout<<a.substr(3)<<" "<<b.substr(3)<<" "<<sum<<" $";
	for(int i=ad;i<bd;i++)
	bh+=24;
	for(int i=ah;i<bh;i++)
	{
		cent+=(60-am)*toll[i%24];
		am=0;
	}
	if(am==0)
	cent+=bm*toll[bh%24];
	else
	cent+=(bm-am)*toll[bh%24];
	printf("%.2lf\n",0.01*cent);
	return cent;
}
int main(void)
{
	int N,p=0;
	string str,tmp;
	for(int i=0;i<24;i++)
	scanf("%d",&toll[i]);
	for(int i=0;i<24;i++)
	dayCost+=toll[i];
	dayCost*=60;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		node n;
		cin>>str;
		if(m.find(str)==m.end())		//not exist
		{
			m[str]=p;p++;
		}
		cin>>n.time>>tmp;
		if(tmp[1]=='n') n.online=true;
		else n.online=false;
		v[m[str]].push_back(n);
	}
	for(int i=0;i<p;i++)
	sort(v[i].begin(),v[i].end(),cmp);
	for(map<string,int>::iterator i=m.begin();i!=m.end();i++)
	{
		int month,sum=0;
		for(int j=0;j<v[i->second].size()-1;j++)
		{
			if(v[i->second][j].online&&!v[i->second][j+1].online)
			{
				if(sum==0)
				{
					month=convert(v[i->second][j].time[0],v[i->second][j].time[1]);
					cout<<i->first<<" ";
					printf("%02d\n",month);
				}
				sum+=print(v[i->second][j].time,v[i->second][j+1].time);
			}
		}
		if(sum!=0) printf("Total amount: $%.2lf\n",0.01*sum);
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值