前言:知道结果的我,眼泪掉下来······
在比赛的时候想偏了,以为要通过不同元素的组合来判断该元素能不能放入,现在是悔不当初······
排除危险
实验老师要将购置的化学物品装箱,这些化学物品是简单化合物,每个化学物品由两种化学元素组成,用x+y表示,其中x和y是用整数表示的化学元素。装箱有一个安全隐患,如果箱子里任何n个化学物品,正好包含n种元素,那么将组成一个容易爆炸的混合物。为了安全,实验老师每拿到一个化学物都要进行判断,如果与已装箱的化学物形成易爆,就不装箱,否则就装箱。假设实验老师按照输入的顺序进行装箱,编程输出有多少个化学物没有装箱。例如1+2、2+3、1+3,三组三种元素就易爆。再如1+2, 7+2, 4+6, 1+5,四组六种元素不会易爆,但再加5+7就不行,因为1+2, 7+2, 1+5, 5+7就组成四组四种元素,所以5+7就不能装箱。
输入要求
数据包含若干行,每行输入2个整数x,y(0<=x,y<=105)代表一个由元素x和y组成的化学物品。数据用-1结尾。
化学元素和化学物品的个数不确定,但在正整数范围之内。
输出要求
输出没有装箱的化学物数量,并换行
样例输入
1 2
3 4
3 5
3 1
2 3
4 1
2 6
6 5
-1
样例输出
3
题意
关键点:如果箱子里任何n个化学物品,正好包含n种元素,那么将组成一个容易爆炸的混合物
解题思路
①、统计已经装了多少种元素n。
②、用映射统计已装入是元素种类cnt。
③、每次都假设装入该化学品组。
判断:已装的元素种类数是否等于已装的化学品组数,则不能将该组装箱。
③、未装箱数ans = 总化学品组数n - 已装箱化学品组数cnt。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map <ll,ll> vis;
int main()
{
ll x, y, ans=0, n=0, cnt=0;
while(cin>>x)
{
int res=0;
//结束
if(x==-1)
break;
cin>>y;
n++; //一共有多少组化学品
if(vis[x]==0)
res++;
vis[x]++;
if(vis[y]==0)
res++;
vis[y]++;
ans++; //假设该组化学品放入箱中
cnt += res; //存在元素个数
if(ans==cnt) //如果组数和元素数相等,则不能放进去
{
ans--;
cnt-=res;
vis[x]--;
vis[y]--;
}
}
cout<<n-ans<<endl;
return 0;
}
总结
解题前最好先按题意模拟一遍,不要按自己的意思先入为主,思维固定后在比赛中很难改变过来。
希望能够将自己的一些学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白