• 环路运输 (单调队列)


    题目描述

    在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。每座仓库都存有货物,其中编号为 i 的仓库库存量为 Ai。在 i 和 j 两座仓库之间运送货物需要的代价为 Ai+Aj+dist(i,j)。求在哪两座仓库之间运送货物需要的代价最大。1≤N≤10^6,1<=Ai<=10^7。

    输入

    第一行一个整数N,第二行N个整数A1~AN。

    输出

    一个整数,表示最大代价。

    样例输入

    5
    1 8 6 2 5
    

    样例输出

    15

    但是因为最大子序和的时候是不是单调队列做的,所以还是当作再熟悉一下单调队列
    思路很清晰,将环断开变成二倍长,枚举每个位置i,求i-n/2<=j<=i-1的区间范围内a[j]-j的最大值maxx
    这个就需要单调队列维护一下,然后每个对于每个i最大值就是i+a[i]-(maxx)
    最后比较一下即可
    我们需要维护一个单调递减的队列,因为对于位置靠前但是值更小的值是没意义的,所以每次进入值时这个值一定要是队列里面的最小值
    #include "bits/stdc++.h"
    using namespace std;
    const int maxn=2e6+10;
    typedef long long ll;
    int a[maxn];
    int b[maxn];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[i+n]=a[i];
        }
        if(n==1)
        {
            printf("0
    ");
            return 0;
        }
        int st=0,en=0,ans=0;
        for(int i=2;i<=2*n;i++)
        {
           int temp=a[i-1]-i+1;
           if(en==0)
           {
               b[en++]=temp;
           }
           else
           {
               while(en-1>=st)
               {
                  if(b[en-1]>=temp)
                  {
                      b[en++]=temp;
                      break;
                  }
                  else
                  {
                      en--;
                  }
               }
               if(st==en)
               {
                   b[st]=temp;
                   en++;
               }
           }
           int posi=i-(n/2+1);//超出范围的值要弹出
           if(posi>=1&&a[posi]-posi==b[st])
           {
               st++;
           }
           ans=max(b[st]+i+a[i],ans);
        }
        printf("%d
    ",ans);
        return 0;
    }
    View Code




  • 相关阅读:
    Spring常用注解汇总
    Maven依赖Scope标签用法
    CRC编码
    Spring Boot中使用Spring Security进行安全控制
    Spring Cloud构建微服务架构(一)服务注册与发现
    http://www.cnblogs.com/kkdn/
    在Java中,你真的会日期转换吗
    利用SpringCloud搭建一个最简单的微服务框架
    Spring Boot微服务框架的搭建
    Spring Cloud全家桶主要组件及简要介绍
  • 原文地址:https://www.cnblogs.com/xiaolaji/p/10803346.html
Copyright © 2020-2023  润新知