题目链接
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; }