2020“远光杯”网络资格赛——排除危险

前言:知道结果的我,眼泪掉下来······
在比赛的时候想偏了,以为要通过不同元素的组合来判断该元素能不能放入,现在是悔不当初······

排除危险

实验老师要将购置的化学物品装箱,这些化学物品是简单化合物,每个化学物品由两种化学元素组成,用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;
}

总结

解题前最好先按题意模拟一遍,不要按自己的意思先入为主,思维固定后在比赛中很难改变过来。

希望能够将自己的一些学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章