专栏文章
题解:P11467 网瘾竞赛篇之 generals 大法好
P11467题解参与者 2已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mipz2a7a
- 此快照首次捕获于
- 2025/12/03 20:17 3 个月前
- 此快照最后确认于
- 2025/12/03 20:17 3 个月前
P11467题解
考虑贪心,每次开所耗兵力最小的塔,当 时判断是否再开新的塔。
证明
假设每次不是开所耗兵力最小的塔,又因为只能当 时 t1e 同学的兵力才能超过对面。则所让 时所需的回合数一定大于每次开所耗兵力最小的塔所需的回合数,故假设不成立。
判断有无解
显然只有当 时 t1e 同学的兵力才能超过对面。当 时 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 条评论,欢迎与作者交流。
正在加载评论...