Description
有一群喜歡帶小紅帽的傢伙舉行了一場別開生面的聚會,然而某些人被邪惡的WM講帽子上塗了大灰狼的表徵圖,可是每個人看不到自己頭上的帽子有沒有被塗,他們只能看到其他人頭上的帽子是不是大灰狼的圖案,現在告訴你每個人看到的別人頭上大灰狼帽子的數量,聰明的你啊,能不能判斷出來一共有多少個人頭上被汪淼塗了可惡的大灰狼呢,當然如果你發現有些人撒謊的話,就直接輸出-1吧
Input包含多組測試資料,每組數組有兩行
第一行讀入一個n,代表聚會的人數 (n<=100)
第二行一次讀入n個數,a[i]代表第i個人看到的其他人頭上的大灰狼的個數Output每組資料輸出一個數,多少人被塗了大灰狼Sample Input3
1 2 1
4
1 1 1 2Sample Output2
-1
演算法:
起先看到這個題目時,不知道如何下手,但迅速找一種情況來分析下,比如有5個傢伙
若都沒有大灰狼表徵圖則:0 0 0 0 0
如果有一個: 0 1 1 1 1
如果有兩個:1 1 2 2 2
如果有三個:2 2 2 3 3
如果有四個:3 3 3 3 4
如果有5個:4 4 4 4 4
可以看出上面的規律,若有n個人,其中m個有大灰狼表徵圖的話,其中有結果有m個m-1和n-m個m(如果m為0的話,是n個0)
其他都是細節問題,下面上代碼
#include<iostream>#include<vector>using namespace std;#define num 100int main(){int n;while(cin>>n){bool flag=true;int a[100]={0};vector<int>vetmp;for(int i=0;i<n;i++){int input;cin>>input;//如果輸入大於人數減一if(input>n-1&&flag==true){flag=false;cout<<-1<<endl;}elsea[input]++;//用於統計多少人數,相當於計數排序}if(flag==false)continue;int sum=0,max=-1,min=-1;for(int i=0;i<num;i++){if(a[i]!=0){sum++;if(min==-1)min=i;else max=i;}}//end for//這種情況是都沒狼或者都有狼if(sum==1&&max==-1&&(min==0||min==n-1)){if(min==0)cout<<0<<endl;else cout<<n<<endl;}//有一些人有狼,有一些人沒狼else if(sum==2&&a[min]==max&&min==max-1){cout<<min+1<<endl;}else{cout<<-1<<endl;}}//end while}