1010: [HNOI2008] 玩具装箱 toy

Problem Specification Value
Time Limit 1 Sec
Memory Limit 162 MB
Submit 8816
Solved 3510

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

HINT

Source



Simple version used to demonstrate the basic principles of writing this problem. There are a few bugs in this version, but it should be either way ignored. This program will not AC, and will TLE.

// Brute force version

#include <iostream>
#include <cstdlib>
#include <cstdio>

#define sqr(x) ((long long)(x) * (long long)(x))
using namespace std;
const int maxn = 50100;
const long long infinit = 0x3f3f3f3f3f3f3f3fll;

int         n, L, C[maxn];
long long   sum[maxn], dp[maxn];

int main()
{
    scanf("%d%d", &n, &L);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &C[i]);
        sum[i] = sum[i - 1] + C[i];
    }
    dp[0] = 0;
    for (int i = 1; i <= n; i++) {
        dp[i] = infinit;
        for (int j = 0; j < i; j++) {
            long long   diff = sqr(sum[i] - sum[j] + i - j - 1 - L);
            dp[i] = min(dp[i], dp[j] + diff);
        }
    }
    printf("%lld\n", dp[n]);
    return 0;
}

from pydatagen import *
n = randrange(1, 50000)
L = randrange(1, 10000000)
printf('%d %d\n' % (n, L))
for i in range(0, n):
    a = randrange(1, 10000000)
    printf('%d\n' % a)
fclose()