贪心
容易发现 $k$ 的值至多为 $n$,而 $1 \leq n \leq 100$,考虑从大到小枚举 $k$ 并检查其合法性。猜测答案没有单调性,否则 $n$ 会开到 $10^5$ 等级。
由于每次能删除的数的上界递减,玩家一每次会删除当前能删除的最大数。
考虑玩家二的策略,由于 $a_i \geq 1$,所以一旦玩家二操作了一个数,这个数之后就不可能被玩家一选中,所以玩家二的操作等于删除一个数,贪心删除最小的数即可。
使用 multiset
维护当前序列,直接模拟过程。
时间复杂度 $O(n^2 \log n)$。
#include<bits/stdc++.h>
using namespace std;
int n,a[105];
void solution(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>=0;i--){
multiset<int> s(a+1,a+n+1);
for(int j=1;j<=i;j++){
if(s.empty()||s.upper_bound(i-j+1)==s.begin()) goto nxt;
s.erase(prev(s.upper_bound(i-j+1)));
if(!s.empty()) s.erase(s.begin());
}
cout<<i<<'\n';
break;
nxt:continue;
}
}
int T;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solution();
return 0;
}