题目描述
公司举办团建活动,许多人在一起玩一个纸牌游戏。规则如下:总共有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;
}