专栏文章
题解:P13849 [CERC 2023] Equal Schedules
P13849题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio4a0o6
- 此快照首次捕获于
- 2025/12/02 13:07 3 个月前
- 此快照最后确认于
- 2025/12/02 13:07 3 个月前
分析
模拟题。
因为我们要求出每个人的值班时长是否与之前相同,所以我们可以使用 map 和 set 来解决这个问题。使用 map 是因为我们要将队员的名字和值班时间相对应。使用 set 是因为两张表格会有值班人员重复登记,而且第一张表格登记的人员,第二张不一定会有;第二张表格登记的人员,第一张不一定会有,所以我们需要使用 set 进行去重和排序操作(因为题目要求输出时按队员名字的字母顺序排列,如果最开始就进行排序,后面就不用再排序了,比较方便)。
思路
用 map 把队员的名字和值班时间相对应,再将出现的值班人员名字都放入 set 中,进行去重和排序,这样方便我们后期使用 map 查找队员的值班时间。如果我有什么表述不清的地方,请指出,谢谢!
代码
CPP#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
string s;
int len=1;
map<string,int> a,b;
set<string> se;
bool f=0;
int main()
{
while(1)
{
s="";
cin>>s;
if(s=="------")
{
break;
}
int k=1,len1=s.size();
int q=0,end;
for(int i=len1-1;i>=0;i--)//将字符串转成数字
{
q+=(s[i]-'0')*k;
k*=10;
}
cin>>end;
cin>>s;
se.insert(s);//将名字加入set
a[s]=a[s]+end-q;
}
while(1)
{
s="";
cin>>s;
if(s=="======")
{
break;
}
int q=0,end,k=1,len1=s.size();
for(int i=len1-1;i>=0;i--)//将字符串转成数字
{
q+=(s[i]-'0')*k;
k*=10;
}
cin>>end;
cin>>s;
se.insert(s);//将名字加入set
b[s]+=end-q;
}
for(auto it=se.begin();it!=se.end();it++)//遍历
{
if(a[*it]!=b[*it])//如果不相等,就输出
{
f=1;
int ans=b[*it]-a[*it];
if(ans>0)
{
cout<<*it<<" "<<"+"<<ans<<endl;//按照题目格式输出,注意,正数的处理方式比较特殊!
}
else
{
cout<<*it<<" "<<ans<<endl;
}
}
}
if(!f)
{
cout<<"No differences found.";
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...