专栏文章
题解:P11467 网瘾竞赛篇之 generals 大法好
P11467题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miqojj6e
- 此快照首次捕获于
- 2025/12/04 08:10 3 个月前
- 此快照最后确认于
- 2025/12/04 08:10 3 个月前
我超,Gen!
推式子即可,半个小时就推完了。
贪心的策略是优先占好占的堡。
注意堡不用全占就可以开始追了。答案取最小值。
所以来说说实现。
先判掉一招秒和无解的情况。
然后模拟每一个堡占掉后的情况,用推出来的柿子算即可。
注意最好不要出现负数,要特判。注意到出现负数以后要考虑的多上天了,容易锅。
每个变量所代表的一定要闹清楚,不然很容易挂。注释的重要性充分体现。
算了一下应该需要
long long,也开着。还有,反复手玩样例极有助于调题。
警惕题面要求的是超对手而追平不被允许。还有就是占堡要一个回合,且与此同时所拥有的堡都可以生产。太好了没注意到挂疯了。
应该没了。
代码贴一下:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[200005];
int fish(int times,int xnow,int y,int x){
int ynow=y*times;
int flc=ynow-xnow;
int cat=x-y;
return 1+flc/cat+times;
}
void solve(){
int n,x,y;
cin>>n>>x>>y;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
if(x+n<=y){
puts("-1");
return;
}else if(x>y){
puts("1");
return;
}
int ans=0,sum=0,ret=1e18;
for(int i=1;i<=n;i++){
if(a[i]>sum){
a[i]-=sum;
int flc=ceil(a[i]*1.0/(x+i-1))+1;
ans+=flc;
sum=flc*(x+i-1)-a[i];
}else{
sum-=a[i];
ans++;
sum+=x+i-1;
}
if(i+x>y)
ret=min(ret,fish(ans,sum,y,i+x));
}
cout<<ret<<endl;
return;
}
signed main(){
int t;
cin>>t;
while(t--)solve();
return 0;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...