洛谷P13849 [CERC 2023] Equal Schedules题解
题目传送门
首先,缩减一下题面:有两个表,由多行数据组成,每行格式为sis_isi,eie_iei,tit_iti,其中sis_isi和eie_iei分别表示员工tit_iti的值班起止时间,第一张表由一行六个减号结束,紧接着是第二张表,由一行六个等号结束,最后输出每个人前后两张表工作时长的差,如果前后工作时长没有任何区别,就输出No differences found.
。
这道题按照题意模拟即可,我们只需两个map数组统计,每个人在两个列表中分别工作了多少时间,然后输出每个人前后两个表工作时长差。
时间复杂度O(n)O(n)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;
}