zoukankan      html  css  js  c++  java
  • JZOJ 1329——旅行【贪心】

    Description

      今天是个神圣的日子,因为LHX教主要进行一段长途旅行。但是教主毕竟是教主,他喜欢走自己的路,让别人目瞪口呆。为什么呢,因为这条路线高低不平,而且是相当的严重。
      但是教主有自己的办法,他会魔法。
      这段路可以用一个长度为N的序列A[I]来表示,A[I]表示了第I这段路的高度。毕竟教主即使会使用魔法他还是个人,教主如果想穿越这条路线,他必须从第1段路开始走,走到第N段,从第I段走到第I+1段路需要消耗|A[I+1]-A[I]|点体力。为了节省体力,教主使出了他神奇的魔法。教主的魔法可以将一段路高度变高或者变低,但是使用魔法也需要体力,改变一段路H的高度就需要消耗H的体力。即若教主把第I段路高度从A[I]变成了K,那么他需要消耗|A[I]-K|点体力。
      接着,LHX教主想规划下如何调整路段高度后穿越,使得总体力消耗最小。

    Input

      输入文件的第1行为一个正整数N,表示了这条路线的长度。
      第2行有N个正整数,相邻两个正整数用空格隔开,描述了A[I]这个序列。

    Output

      输出文件仅包括一个非负整数,为最小的总体力消耗。
      注意:答案可能超过2^31-1,请使用int64或者long long类型保存答案。

    Sample Input

    3
    3 4 1

    Sample Output

    3
    【样例说明】
      将第2段路的高度调整为3,第3段路的高度调整为2,调整体力消耗为2。
      路线序列变为3 3 2,穿越这条路线消耗体力为1。
      所以总体力消耗为3。

    【数据规模】
      对于10%的数据,有N≤10;
      对于30%的数据,有A[I]≤1000;
      对于40%的数据,有N≤1000;
      对于100%的数据,有N≤100000,A[I]≤10000000。
      


    贪心大水法
    从左到右扫一遍,枚举第i段路。如果要使得从i-1到i+1的体力消耗最小,那么就要两端距离间的差距最小。

     ①如果a[i-1]和a[i+1]都小于a[i],那么就取两个中较大的,将a[i]改变;
     ②如果a[i-1]和a[i+1]都大于a[i],那么就取两个中较小的,将a[i]的值改变。
    

    代码如下:

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[100001],f[100001],n;
    long long ans=0;
    int ps(int x)
    {
        if (a[x]>a[x-1]&&a[x]>a[x+1]) return max(a[x-1],a[x+1]);
        if (a[x]<a[x-1]&&a[x]<a[x+1]) return min(a[x-1],a[x+1]);
        return a[x];
    }
    int main()
    {
        int l=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        for (int i=2;i<=n;i++)
        {
            l=ps(i);
            f[i]=abs(a[i]-l);
            a[i]=l;
        }
        for (int i=2;i<=n;i++) ans=ans+f[i]+abs(a[i]-a[i-1]);
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    移动端兼容
    三点优化
    面向对象(一)
    BootCDN和npm
    分页逻辑
    多物体运动框架
    兼容样式
    省略
    行内元素在水平和垂直排列的时候会有间距
    [Swift]LeetCode1053.交换一次的先前排列 | Previous Permutation With One Swap
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412296.html
Copyright © 2011-2022 走看看