zoukankan      html  css  js  c++  java
  • 【P1326】超级教主

    DP优化

    原题:

    LHX教主很能跳,因为Orz他的人太多了。教主跳需要消耗能量,每跳1米就会消耗1点能量,如果教主有很多能量就能跳很高。
    教主为了收集能量,来到了一个神秘的地方,这个地方凡人是进不来的。在这里,教主的正上方每100米处就有一个能量球(也就是这些能量球位于海拔100,200,300……米处),每个能量球所能提供的能量是不同的,一共有N个能量球(也就是最后一个能量球在N×100米处)。教主为了想收集能量,想跳着吃完所有的能量球。教主可以自由控制他每次跳的高度,接着他跳起把这个高度以下的能量球都吃了,他便能获得能量球内的能量,接着吃到的能量球消失。教主不会轻功,教主不会二段跳,所以教主不能因新吃到的能量而变化此次跳跃的高度。并且教主还是生活在地球上的,所以教主每次跳完都会掉下来。
    问教主若要吃完所有的能量球,最多还能保留多少能量。

    N≤2000000 

    保证对于所有数据,教主都能吃到所有的能量球,并且能量球包含的能量之和不超过2^31-1。

    sum[i]表示a[i]的前缀和,很容易推出状态转移方程:f[i]=max{j<i && f[j]>=i*100 | f[j]+sum[i]-sum[j]-i*100}

    但是数据达到2000000,n^2会T,这是后就要优化

    DP优化方法有很多,常用的是记录可行决策然后二分,单调队列,斜率优化,我这么弱斜率优化当然不会,这题似乎不符合单调性质,所以我们搞单调队列

    上面的状态转移方程↑中sum[i]-i*100是不会变的,需要考虑的就是f[j]-sum[j]

    就可以维护单调队列:如果f[i]>f[队头]就进队,f[j]<i*100的出对,然后在队里找就行了

    然而依旧会T

    书上说f[i]-s[i]单调递减的,过程比较长,有兴趣的同学可以试着自己推到(逃

    又因为i*100是单调递增的,所以只需要记录一个temp表示上一个用到的决策点,从temp往后找到一个f[j]>=i*100就行了

    因为f[j]-sum[j]单调递减且i*100单调递增,所以如果有f[j]>=i*100的f[j]>=(i-1)*100也肯定满足,因此从直接从temp开始找就行了,不用管temp前面的

    单调性这种东西给数据打个表比较容易发现,优化DP时打个表挺好的

    代码;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 int read(){int z=0,mark=1;  char ch=getchar();
     8     while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
     9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
    10     return z*mark;
    11 }
    12 int n,m,a[2100000];
    13 int sum[2100000];
    14 int f[2100000];
    15 int temp;
    16 int main(){//freopen("ddd.in","r",stdin);
    17     memset(f,0,sizeof(f));
    18     cin>>n>>m;
    19     sum[0]=0;
    20     for(int i=1;i<=n;i++){  a[i]=read();  sum[i]=a[i]+sum[i-1];}
    21     f[0]=m;  temp=0;
    22     for(int i=1;i<=n;i++){
    23         for(;temp<i;temp++)if(f[temp]>=i*100)  break;
    24         f[i]=f[temp]+sum[i]-sum[temp]-i*100;
    25     }
    26     cout<<f[n]<<endl;
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    MySQL 允许远程连接
    EeePad刷机
    Ubuntu安装Oracle JDK
    Windows Azure Tips
    查看MySQL数据库大小
    Tomcat 7 DBCP 配置(MySQL)
    几个国内的OpenSource镜像站
    好吧,这是我的第一篇文章。
    安卓软件推荐56冰箱IceBox
    ArrayList 冷门方法
  • 原文地址:https://www.cnblogs.com/JSL2018/p/5861687.html
Copyright © 2011-2022 走看看