列表

详情


NC50541. 玩具装箱

描述

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

输入描述

第一行输入两个整数N,L;
接下来N行,每行一个整数C_i

输出描述

输出最小费用。

示例1

输入:

5 4
3
4
2
1
4

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 16ms, 内存消耗: 1100K, 提交时间: 2020-10-20 12:25:04

#include<bits/stdc++.h>
#define k(i,j) 1.0*(y[j]-y[i])/(x[j]-x[i])
using namespace std;
const int nn=51020;
int n,l,c,t,tt;
long long f,s,w,x[nn],y[nn];
int main(){
	scanf("%d%d",&n,&l);
	for(int i=1;i<=n;i++){
		scanf("%d",&c),s+=c+1,w=s-l-1;
		if(t>=tt)t=tt;
		else while(t<tt&&k(t,t+1)<(w<<1))t++;
		f=y[t]-2*w*x[t]+w*w,x[tt+1]=s,y[tt+1]=f+s*s;
		for(;tt&&k(tt-1,tt)>k(tt-1,tt+1);tt--)
			swap(x[tt],x[tt+1]),swap(y[tt],y[tt+1]);
		tt++;
	}return printf("%lld",f),0;
}

上一题