Description
有n个人排成一队,他们都有一个值,如果这个值是个整数xi,表示他有多余的xi个苹果,如果是个负数,表示他想要xi个苹果,有多余苹果的人要把苹果给想要苹果的人,使得每个人的值都变为0,每移动一个苹果给一个人都要花费一个单位的工作量,求完成任务的最小的任务量。Input
有多组测量数据,先输入一个数T,表示有T组数据,然后输入一个n,表示有n个人,然后是n个人的值。Output
求完成任务的最小的任务量。Sample Input
2
5
6 -4 1 -4 1
6
-6 -7 -8 8 9 4
Sample Output
12
57
//有错提醒下
#include<iostream>
using namespace std;
int sum[10002];
int step,n;
int Min(int a,int b)
{
if(a<b) return a;
else return b;
}
void run(int *a)
{
int i,j,k;
for(i=0;i<n;i++)
{
if(a[i]<=0) continue;
if(sum[i]>0)
{
for(j=i+1;j<n&&sum[i]!=0&&a[i]!=0;j++)
{
if(a[j]>=0)
{
step+=Min(sum[i],a[i]);
}
else// a[j]<0
{
if(-1*a[j]<=a[i])//a[i]表示送过来的苹果
{
step+=Min(a[i],sum[i]);
a[i]+=a[j];//还剩下的苹果
sum[i]+=a[j];
a[j]=0;
}
else
{
step+=Min(a[i],sum[i]);
sum[i]-=a[i];
a[j]+=a[i];
a[i]=0;
}
}
}
}
//sum[0]=a[0];
// for(k=1;k<n;k++)
//{
// sum[k]=sum[k-1]+a[k];
//}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a[10002];
int b[10002];
int i;
step=0;
scanf("%d",&n);
scanf("%d",&a[0]);
sum[0]=a[0];//正
for(i=1;i<n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
run(a);
for(i=0;i<n;i++)//反
{
b[i]=a[n-1-i];
}
sum[0]=b[0];
for(i=1;i<n;i++)
{
sum[i]=sum[i-1]+b[i];
}
run(b);
printf("%d\n",step);
}
return 0;
}