Gas Pipeline CodeForces - 1207C 思维 铺设输油管道

题目链接:https://vjudge.net/problem/CodeForces-1207C
题意:输入道路总长度,铺设一个单位的输油管或桥墩的价格,输入一个字符串代表高度,0代表高度为1,1代表高度为2,求最小价格。注意起点终点高度必须为1。
思路:先预处理出从当前位置开始往后有多少个和他相同的高度,然后遍历分情况讨论一下每阶段的花费即可。注意中间计算可能爆int。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
char s[maxn];
long long cnt[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long n,a,b;
        memset(cnt,0,sizeof(cnt));
        scanf("%lld%lld%lld",&n,&a,&b);
        scanf("%s",s);
        int l=strlen(s);
        long long sum=0;
        for(int i=l-2; i>=0; i--)//预处理当前位置往后有多少和它一样高度的
        {
            if(s[i]==s[i+1])
            {
                cnt[i]=cnt[i+1]+1;
            }
            else
            {
                cnt[i]=0;
            }
        }
        bool flag=false;//判断当前建设高度 false为1,true为2
        sum+=b;//最开始的一个桥墩
        for(int i=0; i<l-1; i++)
        {
            if(s[i]=='0'&&s[i+1]=='1'&&!flag)//必须要上升到高度为2的情况
            {
                sum+=2*a+2*b;
                flag=true;
                continue;
            }
            if(flag)//当前高度为2
            {
                if(s[i]=='0')
                {
                    long long cnt1=cnt[i]*(a+b)+2*a+b;//把高度降下来时的花费
                    if(cnt[i]+i<l-1)//相比不下降 如果下降高度并且后面还有高度为2的情况
                    //还需要再加上上升的花费
                    {
                        cnt1=cnt1+b+a;
                    }
                    long long cnt2=cnt[i]*(a+2*b)+a+2*b;//不下降时的花费
                    if(cnt[i]+i==l-1)//最后高度一定是1 连续到最后一位,必须要把高度降下来 相比下降高度
                    //不下降高度必须要额外加上下降的花费
                    {
                        cnt2=cnt2-b+a;
                    }
                    if(cnt1>=cnt2)
                    {
                        sum+=a+2*b;
                    }
                    else
                    {
                        sum+=2*a+b;
                        flag=false;
                    }
                }
                else//为1的情况
                {
                    sum+=a+2*b;
                }
            }
            else//当前高度不为2  
            {
                sum+=a+b;
            }
        }
      //  在最后一位判断高度是多少
        if(flag)
        {
            sum+=2*a+b;
        }
        else
        {
            sum+=a+b;
        }
        printf("%lld\n",sum);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jenkins是一个开源的自动化服务器,可以用于持续集成和持续交付。Pipeline是Jenkins的一种插件,用于实现将软件交付过程中的各个环节自动化并串联起来。而groovy-postbuild则是Pipeline插件中的一个功能,用于在构建完成后执行一些Groovy脚本。 groovy-postbuild功能允许我们根据构建的结果来执行不同的操作。例如,我们可以通过这个功能发送邮件通知构建的结果,或者根据构建的状态来触发其他的流程。在Jenkins Pipeline中使用groovy-postbuild可以通过以下步骤实现: 首先,在Pipeline脚本中引入groovy-postbuild插件。可以在Jenkins的全局库中配置插件,或者在Pipeline脚本中使用`@Library`指令引用插件。 接下来,在构建的某个阶段(如构建完成后)使用groovy-postbuild功能。可以通过在Pipeline脚本中使用`post`块来定义要执行的脚本。在`post`块中可以使用`always`、`success`、`unstable`、`failure`、`changed`等关键字来指定在不同的构建结果下要执行的脚本。 最后,在groovy-postbuild脚本中编写具体的Groovy脚本。这些脚本可以使用Jenkins提供的API来获取构建的信息,执行特定的操作或报告构建的结果。 通过使用jenkins pipeline groovy-postbuild功能,我们可以更加灵活地控制和定制构建后的操作。无论是发送通知、触发其他流程还是生成报告,都可以通过groovy-postbuild功能来实现。这个功能为我们提供了更多的灵活性和定制性,使我们能够更好地适应不同的构建需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值