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;
}//再提一句,这题只是有点麻烦,并不难以理解

浙公网安备 33010602011771号