您的位置:首页 > 产品设计 > UI/UE

【POJ】3017 Cut the Sequence

2012-07-13 20:50 162 查看
#include<cstdio>
#define MAXN 100010
#define MIN(a,b) ((a)<(b)?(a):(b))
typedef __int64 LL;
LL limit,a[MAXN],dp[MAXN];
int n,Q[MAXN];
LL DoIt()
{
LL sum;
int i,j,k,front,rear;
for(i=1;i<=n;i++)
{
if(a[i]>limit)
return -1;
}
sum=dp[0]=0;
front=0;
rear=-1;
for(i=k=1;i<=n;i++)
{
sum+=a[i];
for(;sum>limit;k++)
sum-=a[k];
for(;front<=rear&&Q[front]<k;front++);
for(;front<=rear&&a[Q[rear]]<=a[i];rear--);
Q[++rear]=i;
dp[i]=dp[k-1]+a[Q[front]];
for(j=front;j<rear;j++)
dp[i]=MIN(dp[i],dp[Q[j]]+a[Q[j+1]]);
}
return dp
;
}
int main()
{
int i;
while(~scanf("%d%I64d",&n,&limit))
{
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
printf("%I64d\n",DoIt());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: