题目链接

https://ac.nowcoder.com/acm/contest/7606/B

解题思路

每个人的回合要淘汰尽可能多的人,所以肯定优先淘汰手牌少的。
谁的手牌少?那些抽得的手牌数比被抽走的手牌数少的人吧。
我们根据抽取数量的多少从小到大将他们排序,顺序遍历,因为我们要先淘汰容易淘汰的吧,也就是获取手牌数量少的;若此人可获取的手牌数量比在场剩下的人(不包括他自己)的数量都少,说明他的手牌数量在减少,每轮都减少,肯定最终被淘汰;将每个人都遍历一遍,最后剩下的就是无法被淘汰的人数。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int main(){
    int now,n,a[N];
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    now=n;
    for(int i=1;i<=n;i++){
        if(a[i]<now-1) now--;
    }
    cout<<now<<endl;
}