1016 Phone Bills (25 分)

博客讲述一道很难的模拟题,认为与模拟题相比排序不算什么。解题中使用了玄学的map,其发挥关键作用,节省很多事,还提到公式推导较难,最后附上两组数据供尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很难的模拟题
看题目戳这
排序就算了吧。。。

这题和模拟比起来

排序算什么

我用了一个玄学的map

我自己都不相信他起作用了

这个map很关键

省了很多事

代码如下

下面附了两组数据

你们可以试一下

还有这个公式挺难推的

#include<bits/stdc++.h>
using namespace std;
struct node{
	char name[25];
	int mon,day,h,m;
	int op;
}p[1005],pai[1005];
int fee[25];
map<string,vector<int> > m;
bool cmp(node x,node y){
	if(x.day!=y.day){
		return x.day<y.day;
	}else {
		if(x.h!=y.h){
			return x.h<y.h;
		}else {
			if(x.m!=y.m){
				return x.m<y.m;
			}
		}
	}
	return 1;
}
int main(){
	int n,cnt=0;
	char op[10];
	for(int i=0;i<24;i++){
		scanf("%d",&fee[i]);
	}
	scanf("%d",&n);
	getchar();
	for(int i=0;i<n;i++){
		
		scanf("%s%d:%d:%d:%d%s",p[i].name,&p[i].mon,&p[i].day,&p[i].h,&p[i].m,op);
		if(op[1]=='n'){
			p[i].op=1;
		}else {
			p[i].op=0;
		}
		m[p[i].name].push_back(i);
	}
	for(map<string,vector<int> >::iterator it=m.begin();it!=m.end();it++){
		cnt=0;
		int zans=0;
		bool flag=0;
		for(int i=0;i<(it->second).size();i++){
			pai[cnt++]=p[(it->second)[i]];
		}
		sort(pai,pai+cnt,cmp);
		for(int i=1;i<cnt;i++){
			int ans=0,time=0;
			if(pai[i].op==0&&pai[i-1].op==1){
				if(!flag){
					printf("%s %02d\n",pai[0].name,pai[0].mon);
					flag=1;
				}
				time+=60-pai[i-1].m;
				time+=(23-pai[i-1].h)*60;
				time+=1440*(pai[i].day-pai[i-1].day-1);
				time+=pai[i].h*60;
				time+=pai[i].m;
				ans+=(60-pai[i-1].m)*fee[pai[i-1].h];
				for(int j=pai[i-1].h+1;j<24;j++){
					ans+=fee[j]*60;
				}
				for(int j=pai[i-1].day+1;j<pai[i].day;j++){
					for(int k=0;k<24;k++){
						ans+=fee[k]*60;
					}
				}
				if(pai[i-1].day==pai[i].day){
					for(int k=0;k<24;k++){
						ans-=fee[k]*60;
					}
				}
				for(int j=0;j<pai[i].h;j++){
					ans+=fee[j]*60;
				}
				ans+=fee[pai[i].h]*pai[i].m;
				zans+=ans;
				printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",pai[i-1].day,pai[i-1].h,pai[i-1].m,pai[i].day,pai[i].h,pai[i].m,time,(double)ans/100.0);
				i++;
			}
		}
		if(flag)
			printf("Total amount: $%.2f\n",(double)zans/100.0);
	}
	return 0;
}
/*
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
4
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line

10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
5
aaa 01:01:01:03 on
aaa 01:02:00:01 on
CYLL 01:28:15:41 on
aaa 01:05:02:24 on
aaa 01:02:00:02 off
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值