专栏文章

题解: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 条评论,欢迎与作者交流。

正在加载评论...