【10.20 牛客普及(二)】纸牌游戏 题解

【10.20 牛客普及(二)】纸牌游戏 题解

题目

公司举办团建活动,许多人在一起玩一个纸牌游戏。规则如下:
总共有 n n n 个人,每个人初始有 n n n 张牌。每一轮从第一个人开始轮流操作,第 i 个人每次操作必须选择 m i n min min( p e o p l e people people−1, a i ai ai)个不同的人,分别从他们手中拿走一张牌。其中 p e o p l e people people 为游戏现存人数,手上没有牌的人立即被淘汰出局。大家希望有尽可能多的人出局,游戏无限的进行下去,问最终游戏中最少还有几个人没有出局。
注意:不能从自己手中拿牌


输入

第一行输入一个数字 n n n, 代表游戏的总人数。接下来输入 n n n 个数字,分别代表 a i ai ai


输出

输出一行一个整数表示游戏最终最少剩几个人。


样例

input
2
1 2

output
2

explain
两个人只能互相拿对方的一张牌,游戏永远进行下去。


数据范围

对于 20% 的数据,满足 n n n≤2;

对于 40% 的数据,满足 n n n≤3;

对于 100% 的数据,满足 1≤ n n n≤105,1≤ a i ai ai≤109


解题思路

这道题可以考虑贪心
将每个人的操作数从小到大排
如果这个人的操作数能大于后面能拿ta的人
那么这个人不会出局
所以排序后找到的第一个不会出局的人
后面都不会出局
输出 n n n-这个人的编号+1
则是答案


代码

#include
#include
#include
using namespace std;
int n,a[100010];
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	sort(a+1,a+n+1);
    for (int i=1;i<=n;i++)
        if (a[i]>=n-i)
        {
        	printf("%d",n-i+1);
        	break;
		}
	return 0;
} 

你可能感兴趣的:(牛客,1024程序员节)