专栏文章

题解:P11467 网瘾竞赛篇之 generals 大法好

P11467题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mipz2a7a
此快照首次捕获于
2025/12/03 20:17
3 个月前
此快照最后确认于
2025/12/03 20:17
3 个月前
查看原文

P11467题解

考虑贪心,每次开所耗兵力最小的塔,当 x>yx>y 时判断是否再开新的塔。

证明

假设每次不是开所耗兵力最小的塔,又因为只能当 x>yx>y 时 t1e 同学的兵力才能超过对面。则所让 x>yx>y 时所需的回合数一定大于每次开所耗兵力最小的塔所需的回合数,故假设不成立。

判断有无解

显然只有当 x+n>yx+n>y 时 t1e 同学的兵力才能超过对面。当 x+nyx+n \le y 时 t1e 同学的兵力永远无法超过对面。

Code

CPP
#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,x,y,T,a[300005];
signed main(){
	cin>>T;
	while(T--){
		int ans=1e18;
		cin>>n>>x>>y;
		int army=0,num=0,add=x;//army 为现有兵力,num为回合数,add 为每回合的产兵数
		for(int i=1;i<=n;i++) cin>>a[i];
		if(x>y) {
			cout<<1<<endl;
			continue;
		}
		if(x+n<=y){
			cout<<-1<<endl;
			continue;
		}
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++){
			num=max(num+1,(int)ceill((a[i]-army)*1.0/add)+1);
			int cnt=add*num+army;
		    add++,army=cnt-a[i]-add*num;
			if(add>y)ans=min(ans,army/(y-add)+1);//判断是否再多开塔
		}
		cout<<ans<<endl;
	}
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...