这个题wolxy需要先把可以删除的最大的数删掉,因为下一轮他的“攻击力”会减少,如果不在前一回合把当时可以删掉的最大数删掉的话,下一轮可能就删不掉这个数了,而achhh需要把当前最小的数变大,将最小的数变大以后,wolxy就永远不可能有足够的“攻击力”把这个数消灭掉了。
有人可能会有疑问,我为什么不把本来就大的数变得更大了呢,因为这个数可能本来就比wolxy的攻击力要大,多变一次是浪费的,反倒给了wolxy机会。而把小的变成大的,100%会是一个有效的变化。
#include<bits/stdc++.h>
using namespace std;
int n;
const int M=105;
int a[M];
int b[M];
bool check(int x){
vector<int> ve;
for(int i=1;i<=n;i++) ve.push_back(a[i]);
for(int i=1;i<=x;i++){
int f=x-i+1;
sort(ve.begin(),ve.end());
int l=0; int r=ve.size()-1;
int ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(ve[mid]<=f){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
if(ve.size()&&ve[ans]<=f) ve.erase(ve.begin()+ans);
else return false;
if(ve.size()){
ve[0]+=f;
}
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
int l=0,r=n+3;
int ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
}
}