贪心

容易发现 $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;
}
最后修改:2024 年 09 月 06 日
如果觉得我的文章对你有用,请随意赞赏