小紅帽

來源:互聯網
上載者:User
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}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.