小红帽

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


算法:

起先看到这个题目时,不知道如何下手,但迅速找一种情况来分析下,比如有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 100

int 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;
			}
			else
				a[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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值