前言:知道結果的我,眼淚掉下來······
在比賽的時候想偏了,以爲要通過不同元素的組合來判斷該元素能不能放入,現在是悔不當初······
排除危險
實驗老師要將購置的化學物品裝箱,這些化學物品是簡單化合物,每個化學物品由兩種化學元素組成,用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;
}
總結
解題前最好先按題意模擬一遍,不要按自己的意思先入爲主,思維固定後在比賽中很難改變過來。
希望能夠將自己的一些學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白