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;
}

總結

解題前最好先按題意模擬一遍,不要按自己的意思先入爲主,思維固定後在比賽中很難改變過來。

希望能夠將自己的一些學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白

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