Print Article
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 6389 Accepted Submission(s): 1965
One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost
M is a const number.
Now Zero want to know the minimum cost in order to arrange the article perfectly.
5 5 5 9 5 7 5
230
参考blog :http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define maxn 500005
typedef long long ll;
ll sum[maxn];
ll dp[maxn];
int q[maxn];
int head=0, tail=-1;
int n, m;
ll sq(ll tmp)
{
return tmp*tmp;
}
int size()
{
return tail-head+1;
}
ll getk_up(int i, int j)
{
return dp[i]+sq(sum[i])-dp[j]-sq(sum[j]);
}
ll getk_down(int i, int j)
{
return (sum[i]-sum[j])*2;
}
int main()
{
while(scanf("%d%d", &n, &m)!=EOF){
sum[0] = 0;
for(int i = 1; i <= n; i++){
scanf("%I64d", sum+i);
sum[i] += sum[i-1];
}
head = 0, tail = -1;
dp[0] = 0;
q[++tail] = 0;
for(int i = 1; i <= n; i++){
while(size()>= 2 && getk_up(q[head+1],q[head])<=sum[i]*getk_down(q[head+1],q[head]))
head++;
int pos = q[head];
dp[i] = dp[pos]+sq(sum[i]-sum[pos])+m;
while(size()>=2 && getk_up(i,q[tail])*getk_down(q[tail],q[tail-1])<=getk_up(q[tail],q[tail-1])*getk_down(i, q[tail]))
tail--;
q[++tail] = i;
}
printf("%I64d\n", dp[n]);
}
return 0;
}
2470



被折叠的 条评论
为什么被折叠?



