XDOJ1009--小红帽

来源:互联网 发布:五笔拆字软件 编辑:程序博客网 时间:2024/06/05 01:10
Description
  有一群喜欢带小红帽的家伙举行了一场别开生面的聚会,然而某些人被邪恶的WM讲帽子上涂了大灰狼的图标,可是每个人看不到自己头上的帽子有没有被涂,他们只能看到其他人头上的帽子是不是大灰狼的图案,现在告诉你每个人看到的别人头上大灰狼帽子的数量,聪明的你啊,能不能判断出来一共有多少个人头上被汪淼涂了可恶的大灰狼呢,当然如果你发现有些人撒谎的话,就直接输出-1吧
Input
包含多组测试数据,每组数组有两行 
第一行读入一个n,代表聚会的人数 (n<=100) 
第二行一次读入n个数,a[i]代表第i个人看到的其他人头上的大灰狼的个数
Output
每组数据输出一个数,多少人被涂了大灰狼
Sample Input
3
1 2 1
4
1 1 1 2
Sample Output
2
-1


分析思路:
这个题还是比较简单的,因为正确情况下一个人所说的数字一定是狼的数量或狼的数量减1。难点可以认为是怎么判断是否有人说慌的细节,可以描述方法如下:
(1)对输入的数据进行统计,找出其中最大的数Max和最小的Min,同时也计算出是Max的有多个数
(2)如果Max>=n或者Min>=n,那么这样情况是一定不会出现的,所以返回-1.
(3)如果Min=Max,就是全狼或全不为狼的情况
(4)如果Max-Min>1,这样情况也是不正常的
(5)如果为狼的人数不等于Max,这也是不正常的

(6)输出Max

#include<iostream>using namespace std;int main(){    int N;    int num[101];    for(int i=0;i<101;++i)        num[i] = 0;    while(cin>>N)    {        int maxV = -1;        int minV = 101;        for(int i=0;i<N;++i)            num[i] = 0;        for(int i=0;i<N;++i)        {            int t;            cin>>t;            if(t>maxV)                maxV = t;            if(t<minV)                minV = t;            ++num[t];        }        if(minV>=N||maxV>=N)            cout<<-1<<endl;        else if(minV==maxV)        {            if(minV==0)                cout<<0<<endl;            else                cout<<N<<endl;        }        else if(maxV-minV>1)            cout<<-1<<endl;        else        {            if(num[minV]==maxV)                cout<<maxV<<endl;            else                cout<<-1<<endl;        }    }    return 0;}


0 0
原创粉丝点击