P13849 [CERC 2023] Equal Schedules 题解

首先缩减一下题面:有两个表,由多行数据组成,每行格式为 \(s_i\),\(e_i\),\(t_i\),其中 \(s_i\) 和 \(e_i\) 分别表示员工 \(t_i\) 的值班起止时间。

第一张表由一行六个减号结束,紧接着是第二张表,由一行六个等号结束,最后输出每个人前后两张表工作时长的差,如果前后工作时长没有任何区别,就输出 No differences found.。

由于是道比较水的题,所以我们就仅仅浅浅地讲解一下。

这道题按照题意模拟即可,我们只需两个 map 数组统计每个人在两个列表中分别工作了多少时间,然后输出每个人前后两个表工作时长差。

时间复杂度 \(O(n)\)。

#include<bits/stdc++.h>
using namespace std;
map<string,int> t1,t2;//两个map用来统计每个人在两个列表中分别工作了多少时间
string p[100005],name,x;//统计出现的不同的人名
int cnt,s,e;//有几个不同的人名
int check(string s1){//这个函数用于把数字字符串转换成数字
	int x1=0;
	for(int i=0;i<s1.size();i++){
		x1=x1*10+s1[i]-48;
	}
	return x1;
}
int main(){
	while(1){
		cin>>x;
		if(x=="------")break;//如果输入结束了
		//否则我们会发现接入了下一行的第一个数字,于是我们就要转换成数字
		s=check(x);
		cin>>e>>name;
		if(!t1[name]){//如果这个名字没出现过
			p[++cnt]=name;//记住他的名字
		}
		t1[name]+=e-s;
	}
	while(1){//与上面同理
		cin>>x;
		if(x=="======")break;
		s=check(x);
		cin>>e>>name;
		if(!t2[name]&&!t1[name]){//这里必须是两个列表都没出现过
			p[++cnt]=name;
		}
		t2[name]+=e-s;//左闭右开区间
	}
	sort(p+1,p+1+cnt);//题目说要按照名字升序排序
	bool f=0;
	for(int i=1;i<=cnt;i++){
		if(t2[p[i]]!=t1[p[i]]){
			f=1;
			cout<<p[i]<<" ";//输出他的名字
			if(t2[p[i]]-t1[p[i]]>0){//如果相差的值是正数
				cout<<"+";//输出正号
			}
			cout<<t2[p[i]]-t1[p[i]]<<endl;//输出第二张表减第一张表
		}
	}
	if(!f){//如果每个人在两个列表中分别工作的时长相同
		cout<<"No differences found.";
	}
	return 0;
}//再提一句,这题只是有点麻烦,并不难以理解
posted @ 2026-10-17 21:12  SCX2014  阅读(3)  评论(0)    收藏  举报