寒蝉


私信TA

用户名:uq_27405145493

访问量:2330

签 名:

等  级
排  名 6343
经  验 1428
参赛次数 0
文章发表 6
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

设被怀疑的集合为a,b,c,d,e,已经确定的小球集合为f,那么最终答案为a^b^c^d^e  -  f。问题是怎样求交集,直接用一个map<int,int>记录某个小球被怀疑的次数,每读一次称重结果,对于怀疑的集合,遍历该集合,给其map值+1。对于确定的集合,遍历集合,插入到一个set中。读完以后,遍历set中的元素x,删掉其在map中的值,最终map中的最大值个数,就是答案。

注意事项:

参考代码:


#include <bits/stdc++.h>

using namespace std;

const int N=1e9+10;

map<int,int>s;

set<int> s2;

int n,m,b[1000010],c[1000010];

int main()

{

    cin>>n>>m;

    s.clear();

    s2.clear();

    int ans=0;

    int ma=-1;

    for(int i=1;i<=m;i++)

    {

        int cnt;

        char res;

        scanf(" %d",&cnt);

        for(int j=1;j<=cnt;j++) scanf(" %d",&b[j]);

        for(int j=1;j<=cnt;j++) scanf(" %d",&c[j]);

        scanf(" %c",&res);

        if(res=='<')

        {

           for(int j=1;j<=cnt;j++)

           {

                if(s2.find(c[j])==s2.end()) s2.insert(c[j]);

           }

           for(int j=1;j<=cnt;j++) {s[b[j]]++;ma=max(ma,s[b[j]]);}

        }

        else if(res=='>')

        {

            for(int j=1;j<=cnt;j++)

                {

                    if(s2.find(b[j])==s2.end()) s2.insert(b[j]);

                }

           for(int j=1;j<=cnt;j++) {s[c[j]]++;ma=max(ma,s[c[j]]);}

        }

        else

        {

            for(int j=1;j<=cnt;j++)

            {

                if(s2.find(b[j])==s2.end()) {s2.insert(b[j]);}

                if(s2.find(c[j])==s2.end()) {s2.insert(c[j]);}

             }

        }

    }

    set<int>::iterator it1;

    for(it1=s2.begin();it1!=s2.end();it1++) s.erase(*it1);

    map<int,int>::iterator it;

    for(it=s.begin();it!=s.end();it++)

    {

        //printf("%d->%d\n",it->first,it->second);

        if(it->second==ma) ans++;

    }

    if(ans!=0)

    cout<<ans<<endl;

    else

    {

        cout<<n-s2.size()<<endl;

    }

    return 0;

}


 

0.0分

2 人评分

  评论区

  • «
  • »