zoukankan      html  css  js  c++  java
  • BZOJ1010: [HNOI2008]玩具装箱toy

    【传送门:BZOJ1010


    简要题意:

      给出n条连续线段,每条线段都有长度为x[i],我们可以把连续若干条线段连在一起,变成一个组合,两条线段如果相连,就要在两条线段中间添加一个长度为1的格子(如果没有相连就不用添加),假如我们现在选择把第i条到第j条线段之间的所有线段变成一组合的话,这个组合的总长度就为:x[i]+x[i+1]+x[i+2]+x[i+3]+...+x[j]+j-i,现在给出一个常数L,假设当前选择的组合的长度为s,那么这个组合就为我们产生了(s-L)^2的费用,求出把n条线段分成若干组合所需要的最小费用,单独的线段可以成为一个组合


    题解:

      首先可以敲出一个DP,f[i]表示到第i个线段时,将1到i个线段都分成若干个组合的最小值

      显然这个DP的时间复杂度是O(n^2),会超时

      我们就用斜率优化来优化(其实这是斜率优化的例题。。)


    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    using namespace std;
    typedef long long LL;
    LL a[51000],s[51000],f[51000];
    /*
    f[i]=min(f[j]+(sum[i]-sum[j]+i-j-1-L)^2)
    f[i]=min(f[j]+(s[i]-s[j]-L)^2)
    f[j2]+(s[i]-s[j2]-L)^2<=f[j1]+(s[i]-s[j1]-L)^2
    f[j2]+(s[i]-L)^2-2*s[j2]*(s[i]-L)+s[j2]^2<=f[j1]+(s[i]-L)^2-2*s[j1]*(s[i]-L)+s[j1]^2
    f[j2]+s[j2]^2-2*s[j2]*(s[i]-L)<=f[j1]+s[j1]^2-2*s[j1]*(s[i]-L)
    f[j2]-f[j1]+s[j2]^2-s[j1]^2<=2*s[j2]*(s[i]-L)-2*s[j1]*(s[i]-L)
    f[j2]-f[j1]+s[j2]^2-s[j1]^2<=2*s[j2]*(s[i]-L)-2*s[j1]*(s[i]-L)
    (f[j2]-f[j1]+s[j2]^2-s[j1]^2)/(s[j2]-s[j1])<=2*(s[i]-L)
    */
    double slop(int j1,int j2)
    {
        return (f[j2]-f[j1]+s[j2]*s[j2]-s[j1]*s[j1])/(s[j2]-s[j1]);
    }
    int list[51000];int head,tail;
    int main()
    {
        LL L;int n;
        scanf("%d%lld",&n,&L);L++;
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        s[1]=a[1]+1;
        for(int i=2;i<=n;i++) s[i]=s[i-1]+a[i]+1;
        head=1;tail=1;list[1]=0;
        for(int i=1;i<=n;i++)
        {
            while(head<tail&&slop(list[head],list[head+1])<=2.0*(s[i]-L)) head++;
            int j=list[head];
            f[i]=f[j]+(s[i]-s[j]-L)*(s[i]-s[j]-L);
            while(head<tail&&slop(list[tail],i)<slop(list[tail-1],list[tail])) tail--;
            list[++tail]=i;
        }
        printf("%lld
    ",f[n]);
        return 0;
    }

     

    渺渺时空,茫茫人海,与君相遇,幸甚幸甚
  • 相关阅读:
    git代码合并与冲突
    jQuery 事件方法---vvvv0
    原生JS获取HTML DOM元素的方法----------c
    JQuery获取元素的方法总结--ccc
    zookeeper[5] zookeeper集群配置及伪集群配置
    zookeeper[4] 安装windows zookeeper,及问题处理
    zookeeper[3] zookeeper API开发注意事项总结
    zookeeper[2] zookeeper原理(转)
    zookeeper[1] (转)ZooKeeper Programmer's Guide(zookeeper编程向导)---中文
    Java[1] Java学习书籍汇总(转)
  • 原文地址:https://www.cnblogs.com/Never-mind/p/7523079.html
Copyright © 2011-2022 走看看