纸牌游戏(贪心,思维,结论题)

题目描述
公司举办团建活动,许多人在一起玩一个纸牌游戏。规则如下:总共有n个人,每个人初始有n张牌。每一轮从第一个人开始轮流操作,第i个人每次操作可以选择至多ai个不同的人,分别从他们手中拿走一张牌。手上没有牌的人立即被淘汰出局。大家都不希望自己出局,并且希望有尽可能多的人出局,游戏无限的进行下去,问最终游戏中最少还有几个人没有出局。

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

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

样例输入
2
1 2

样例输出
2
提示
样例解释:两个人只能互相拿对方的一张牌,游戏永远进行下去。
【数据范围】
对于20%的数据,满足n≤2;
对于40%的数据,满足n≤3;
对于100%的数据,满足1≤n≤105,1≤ai≤109。

思路:

因为想要尽可能多的淘汰人,理所当然是每个人都去拿牌最少的人
又因为每个人都可以拿一定数量别人的牌,所以只要当他拿别人牌的数量大于等于比除他以外的人的数量,那么他就不会被淘汰

将每个人能拿的牌数按小到大排序后,每个人都会优先去拿他的牌,假设这是第i个人,那么就有n-i个人能拿他的牌(前面i个人已经被淘汰了),索引从0开始的话就是n-i-1个人能拿他的牌

所以把每个人能拿的牌按从小到大排序后,只要找到第一个不会被淘汰的人即可知道最少可以剩下多少人

AC代码

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
typedef long long ll;
 
ll n,ans;
vector<ll> a;
 
int main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for(ll i = 1; i <= n; i++)
    {
        ll cnt;
        cin >> cnt;
        a.push_back(cnt);
    }
    sort(a.begin(),a.end());
    for(int i = 0; i < n; i++)
    {
        if(a[i] < n-1-i)
        {
            ans++;
        }
    }
    cout << n-ans << endl;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值