Number Game
爱丽丝和鲍勃正在玩游戏。它们具有正整数数组一个尺寸n.
在开始游戏之前,爱丽丝选择一个整数千≥0.游戏持续k阶段,阶段的编号从1自k.在我-th 阶段,Alice 必须从数组中删除小于或等于 的元素k−i+1.之后,如果数组不为空,Bob 必须添加k−i+1到数组的任意元素。请注意,爱丽丝的移动和鲍勃的移动都是游戏同一阶段的两个部分。如果爱丽丝在某个阶段无法删除元素,她就输了。如果k-第一阶段结束,爱丽丝还没有输,她赢了。
您的任务是确定k这样,如果两个玩家都发挥最佳状态,爱丽丝可以获胜。鲍勃对阵爱丽丝,所以如果可能的话,他试图让她输掉比赛。
输入
第一行包含单个整数t (1≤吨≤100) — 测试用例的数量。
每个测试用例的第一行包含一个整数n (1≤n≤100) — 数组的大小一个.
第二行包含n整数a1,a2,a3…an (1≤ai≤n).
输出
对于每个测试用例,打印一个整数 — 最大值k这样,如果两个玩家都发挥最佳状态,爱丽丝可以获胜。
Example
inputCopy
4
3
1 1 2
4
4 4 4 4
1
1
5
1 3 2 1 1
outputCopy
2
0
1
3
每次寻找第一个大于等于k-i+1的值并删除,每次把k-i+1加到最小值上面。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
cin>>t;
while(t--)
{
multiset<int>l;
cin>>n;
for(int i=0; i<n; i++)
{
int a;
cin>>a;
l.insert(a);
}
if(n==1&&*l.begin()==1)
{
cout<<"1"<<'\n';
continue;
}
int s=0;
for(int k=1; k<=n; k++)
{
multiset<int> g=l;
int ok=-1;
for(int i=1; i<=k; i++)
{
int f=-1;
for(int c:g)
if(c<=k-i+1) f=c;
else break;
if(f==-1)
{
ok=1;
break;
}
multiset<int>::iterator pos=g.lower_bound(f);
g.erase(pos);
int b=*g.begin();
g.erase(g.begin());
g.insert(b+k-i+1);
}
if(ok==1) break;
s=k;
}
cout<<s<<'\n';
}
return 0;
}