题解|#加法删除博弈#

加法删除博弈

https://ac.nowcoder.com/acm/contest/70759/C?&headNav=acm

这个题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;
	}
	
}

竞赛奋斗日志 文章被收录于专栏

一个奋斗的蒟蒻

全部评论

相关推荐

头像
昨天 23:54
已编辑
门头沟学院 化工与制药类
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务