• BZOJ1010 [HNOI2008]玩具装箱toy


    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

     

     

    本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!

     

    Description

      P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压
    缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过
    压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容
    器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一
    个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,
    如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容
    器,甚至超过L。但他希望费用最小.

    Input

      第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

    Output

      输出最小费用

    Sample Input

    5 4
    3
    4
    2
    1
    4

    Sample Output

    1

     

     

    正解:决策单调性+DP+单调队列

    解题报告:

      许久之前的一道考试题目了,题解直接用学长的了:

      

      首先贪心明显是错的(虽然可以过样例),想找反例的话随便看一个测试数据吧。
      由于同一容器中玩具的编号必须是连续的,因此满足无后效性,可用动态规划解决。一个比较容易想到O(N^2 )的算法是,用F i 表示装前i个玩具的最少费用,S i 表示前i个玩具的总长度,则状态
      转移方程为:
      F i = min {F j + (S i − S j + i − (j + 1) − L) 2 }0≤j<i
      但由于N 最大可达到50000,所以期望得分为10∼20分。
      然而,真正颇为牛B的东西来了。
      令S i ′ = S i + i, L ′ = L + 1,让我们重新观察原方程:
      F i = min {F j + (S i ′ − S j ′ − L ′ ) 2 } 0≤j<i
      令V j = F j + (S i ′ − S j ′ − L ′ ) 2 ,那么在x < y时,V x ≥ V y 可变形为:
      F x − F y ≥ (S i ′ − S y ′ − L ′ ) 2 − (S i ′ − S x ′ − L ′ ) 2
      ⇒ F x − F y ≥ (2S i ′ − S x ′ − S y ′ − 2L ′ )(S x ′ − S y ′ )
      ⇒ F x − F y ≥ (2(S i ′ − L ′ ) − (S x ′ + S y ′ ))(S x ′ − S y ′ )
      ⇒ F x − F y ≥ 2(S i ′ − L ′ )(S x ′ − S y ′ ) − (S x ′ + S y ′ )(S x ′ − S y ′ )
      ⇒ F x − F y + S x ′ − S y ′ ≥ 2(S i ′ − L ′ )(S x ′ − S y ′ )
      这样的话,如果对于当前的i,有x < y, V x ≥ V y ,那么对于以后更大的i,由于2(S i ′ − L ′ )的单调性,V x ≥ V y
      将会恒成立,也就是说x不可能再成为最优决策,我们将永远不会再用到它。

      因为决策i可能比原队列中的某些决策更优,如果不将这些肯定没用的决策删除,队列前面的非最优决策可能受到它们当中的某个决策“保护”而没有被删除,其实这样也就是保证函数G的值在Q中单调递增。
      由于每个元素最多入队一次,出队一次,所以维护队列的时间复杂度为O(N ),状态转移为O(1),计算F 值为O(N ),所以总时间复杂度为O(N ) + O(1) × O(N ) = O(N )。

     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 using namespace std;
    14 typedef long long LL;
    15 const LL inf = (1LL<<50);
    16 const int MAXN = 50011;
    17 int n,a[MAXN],dui[MAXN],head,tail;
    18 LL L,f[MAXN],sum[MAXN],S[MAXN];
    19 
    20 inline int getint()
    21 {
    22     int w=0,q=0; char c=getchar();
    23     while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 
    24     while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
    25 }
    26 
    27 inline bool check(int x,int y,int i){
    28     x=dui[x]; y=dui[y];
    29     LL ji=f[x]-f[y]+S[x]*S[x]-S[y]*S[y];
    30     LL comp=2*(S[i]-L); comp*=S[x]-S[y];
    31     if(ji>=comp) return true;  return false;
    32 }
    33 
    34 inline bool check2(int x,int y,int i){
    35     x=dui[x]; y=dui[y]; 
    36     LL ji1=f[x]-f[y]+S[x]*S[x]-S[y]*S[y]; ji1/=(S[x]-S[y]);
    37     LL ji2=f[y]-f[i]+S[y]*S[y]-S[i]*S[i]; ji2/=(S[y]-S[i]);
    38     if(ji1>=ji2) return true;  return false;
    39 }
    40 
    41 inline void work(){
    42     n=getint(); L=getint(); for(int i=1;i<=n;i++) a[i]=getint(),sum[i]=sum[i-1]+a[i],S[i]=sum[i]+i;
    43     head=tail=0; dui[head]=0; L++;
    44     for(int i=1;i<=n;i++) {
    45     while(head<tail && check(head,head+1,i))  head++;
    46     f[i]=f[dui[head]]+(S[i]-S[dui[head]]-L)*(S[i]-S[dui[head]]-L);
    47     while(head<tail && check2(tail-1,tail,i)) tail--;
    48     dui[++tail]=i;
    49     }
    50     printf("%lld",f[n]);
    51 } 
    52 
    53 int main()
    54 {
    55     work();
    56     return 0;
    57 }
  • 相关阅读:
    转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
    转载:《理解OAuth 2.0》 阮一峰
    转载:《RESTful API 设计指南》 阮一峰
    转载:《理解RESTful架构》 阮一峰
    转载:2.2.5 在配置中使用变量《深入理解Nginx》(陶辉)
    转载:2.2.4 配置项的单位《深入理解Nginx》(陶辉)
    转载:2.2.3 配置项的注释《深入理解Nginx》(陶辉)
    SQL & PL/SQL 模块总结
    一些比较好的shellscript脚本
    11 高级优化技术
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6009656.html
Copyright © 2020-2023  润新知