中石油训练赛 - 姓氏(思维+水题)

题目描述

在一个很大的课室里,里面有很多学生在听课。L老师挑选了其中的N个不同的学生起立回答问题,L老师对起立的每一个学生都是问同样的问题:“在本课室里,和你同姓的学生有多少人(不包括你自己)?”。这N个起立的同学的回答如下:
第1位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[1]个学生。
第2位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[2]个学生。
第3位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[3]个学生。
。。。。。。

第N位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[N]个同学。
假设这N位同学的回答都是正确的,那么课室里至少有多少个学生?

输入

第一行,一个整数N。
第二行,N个整数,空格分开,第i个整数表示A[i]。

输出

一个整数,表示课室里至少有多少个学生。

样例输入

4
1 2 1 2

样例输出

5

提示

根据4位学生的回答,可以推断出课室不可能少于5个学生,所以输出5。
对于20%的数据, N = 2,0<=A[i]<=10。
对于另外20%的数据, N = 3, 0<=A[i]<=100。
对于100%的数据,3


题目大意:给出n个条件,说明除自己之外有a[i]个人的姓氏和自己相同,问全班最少有多少个人

题目分析:首先我们要简单转换一下,出自己之外有a[i]个人的姓氏和自己相同,也就是全班一共有a[i]+1个人有当前第i个人的姓氏,一开始我是想直接用set去重然后记录一下有多少个不同的数字的,然后累加一下,但是WA掉了,去找xy大佬要了一个数据,直接把我hack掉了,那就是

4

2 2 2 2

正确答案应该是6,而我的程序给出的答案是4,现在我意识到了这个题目还和a[i]+1的数量有关系,如果a[i]+1的数量大于a[i]+1的话,那么用一个姓氏就不够了,所以我们还需要用map储存一下有多少个a[i]+1,最后处理的时候稍微注意一下这个细节就好了

一开始没做这个题是因为确实没看懂题。。第一反应还以为是福尔摩斯找犯人的那种逻辑模拟题,结果发现就是个简单思维题

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=1e5+100;
 
int main()
{
//  freopen("input.txt","r",stdin);
//	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	mapmp;
	for(int i=1;i<=n;i++)
	{
		int num;
		scanf("%d",&num);
		num++;
		mp[num]++;
	}
	int sum=0;
	for(auto it:mp)
	{
		sum+=it.first;
		while(mp[it.first]>it.first)
		{
			mp[it.first]-=it.first;
			sum+=it.first;
		}
	}
	if(sum>=n)
		printf("%d\n",sum);
	else
		printf("%d\n",n);
	
	
	
	
     
     
     
     
      
     
    return 0;
}

 

你可能感兴趣的:(水题,思维,思维,水题)