纸牌游戏(思维+贪心策略)

【题目描述】

公司举办团建活动,许多人在一起玩一个纸牌游戏。规则如下:总共有𝑛个人,每个人初始有𝑛张牌。每一轮从第一个人开始轮流操作,第𝑖个人每次操作必须选择𝒎𝒊𝒏(𝒑𝒆𝒐𝒑𝒍𝒆−𝟏,𝒂𝒊)个不同的人,分别从他们手中拿走一张牌。其中people 为游戏现存人数,手上没有牌的人立即被淘汰出局。大家都不希望自己出局,并且希望有尽可能多的人出局,游戏无限的进行下去,问最终游戏中最少还有几个人没有出局。注意:不能从自己手中拿牌【输入格式】第一行输入一个数字𝑛,代表游戏的总人数。接下来输入𝑛个数字,分别代表ai【输出格式】输出一行一个整数表示游戏最终最少剩几个人。

样例

样例输入

复制2
1 2

样例输出

复制2

【数据范围】

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

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

对于100% 的数据,满足1≤𝑛≤105,1≤𝑎𝑖≤109。

废话:这道题目感觉怪怪的,感觉好像没有什么特别的方法(毕竟人家是思维题目嘛。。。)

题目分析:

每个人最开始都有n张牌,可以拿a[i]张牌,如果想让剩牌的人最少,那么我们可以假设所有的人都针对那个可以拿牌的数量最少的人,那么:剩余的人> 这个人的拿牌数量,这个人就必死无疑,不取等号的原因是这个人是有初始的牌的数量的,相当于不管别人怎么拿,他牌的数量都不会发生变化。

采取贪心策略:将所有人的牌从小到大排序,i从1到n枚举,然后所有人都针对这个目前还活着的能拿牌最少的人,如果这个人都已经无法出局,那后面拿牌更多的人就更无法出局了,所以我们就可以直接退出运算。

#include <bits/stdc++.h>
using namespace std ;
const int MAXN = 1e5 + 5 ;
int n, a[MAXN], Ans = 0 ;
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)
		{
			Ans ++ ;
		}
	}
	printf("%d", n - Ans) ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值