解题思路:
设被怀疑的集合为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 人评分
简单的a+b (C语言代码)浏览:764 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:897 |
printf基础练习2 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1483 |
杨辉三角 (C语言代码)浏览:504 |
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2256 |
1197求助浏览:667 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:487 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:852 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:456 |