专栏文章

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

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

文章操作

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

当前评论
2 条
当前快照
1 份
快照标识符
@miqojj6e
此快照首次捕获于
2025/12/04 08:10
3 个月前
此快照最后确认于
2025/12/04 08:10
3 个月前
查看原文
我超,Gen!

推式子即可,半个小时就推完了。
贪心的策略是优先占好占的堡。
注意堡不用全占就可以开始追了。答案取最小值。
然后被细节卡了一个小时 /qd
所以来说说实现。
先判掉一招秒和无解的情况。
然后模拟每一个堡占掉后的情况,用推出来的柿子算即可。
注意最好不要出现负数,要特判。注意到出现负数以后要考虑的多上天了,容易锅。
每个变量所代表的一定要闹清楚,不然很容易挂。注释的重要性充分体现。
算了一下应该需要 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 条评论,欢迎与作者交流。

正在加载评论...