zoukankan      html  css  js  c++  java
  • P4597 序列sequence

    传送门

    题解

    完全看不懂大佬们在说什么……特别是chen_zhe大佬写的……

    来说说个人的理解吧

    大佬们说:考虑当前的数$x$和之前的最大数$y$,(默认$x<y$,因为如果$x>=y$已经满足非降了)为了让它非降,我们要在区间$[x,y]$里找到一个数$z$,使$y$减小到$z$,$x$增大到$z$,那么可以发现,不管取的数是什么,代价都是$y-x$

    不难看出,$y$减小的越多,后面的序列越容易变成非降,那么只要让$y$减小到$x$就好了

    看到这里,我一直有一个疑问,如果令$y$减小到$x$之后,序列不满足非降了怎么办?

    仔细想了想,实际上应该是这样的:为了让序列非降,$y$不能小于$y$之前的最大值。而由于$y$是整个序列的最大值,如果它之前的最大值$z$小于等于$x$,那么将$y$减小到$x$仍能保证序列是非降的。否则的话,$z$大于$x$小于$y$,仍是在区间$[x,y]$内,那么移动的代价是$y-x$,所以用于更新答案是没有问题的

    那么这里为什么要让$y$减到最小呢?这是因为$x$和$y$不论如何调整,他们的代价之和都已经不变了,但问题是他们目前选的最优方案并不是之后的最优。为了满足他们在之后最优,只有把$y$减小到$x$,才能保证之后更有可能非降。

    概括一下,对于当前的数,无论最优解如何,对答案的贡献是一定的。而为了保证之后的解也最优,令$y$减小到$x$,可以保证之后的解最优,且不会影响当前的最优解

    代码好短……

     1 //minamoto
     2 #include<cstdio>
     3 #include<iostream>
     4 #include<queue>
     5 using namespace std;
     6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
     7 char buf[1<<21],*p1=buf,*p2=buf;
     8 inline int read(){
     9     #define num ch-'0'
    10     char ch;bool flag=0;int res;
    11     while(!isdigit(ch=getc()))
    12     (ch=='-')&&(flag=true);
    13     for(res=num;isdigit(ch=getc());res=res*10+num);
    14     (flag)&&(res=-res);
    15     #undef num
    16     return res;
    17 }
    18 priority_queue<int> q;
    19 int n;long long ans;
    20 int main(){
    21     n=read();
    22     while(n--){
    23         int x=read();q.push(x);
    24         if(x<q.top()){
    25             ans+=q.top()-x;
    26             q.pop();q.push(x);
    27         }
    28     }
    29     printf("%lld
    ",ans);
    30     return 0;
    31 }
  • 相关阅读:
    文件权限
    文件权限
    Nginx SSL/HTTPS 配置
    Nginx SSL/HTTPS 配置
    Nginx SSL/HTTPS 配置
    安装opencv3.3.0方法
    安装opencv3.3.0方法
    安装opencv3.3.0方法
    安装opencv3.3.0方法
    阿里巴巴的体量到底有多大?
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9462864.html
Copyright © 2011-2022 走看看