本来很简单的一道贪心题,可我开始方向想错了,硬是用模拟在做,结果超时,看了别人的题解才转换过来思路。。。
由于居民只关心酒的数量以及交易是否能够完成,不关心与谁交易,也不用考虑中间的存积货这些问题,所以对于第一户来说,最省钱的方法就是直接与第二户交易,也就是把第二户当作通往最近的交易对象的桥梁,对于第二户也是类似的情况,所以就直接遍历一次就够了。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 100100
using namespace std;
int n,s[MAX];
int main()
{
int i,j;
long long sum;
while(scanf("%d",&n)&&n)
{
sum=0;
s[0]=0;
for(i=1;i<n;i++)
{
scanf("%d",&s[i]);
s[i]+=s[i-1];
sum+=abs(s[i]);
}
scanf("%d",&s[i]);
printf("%lld\n",sum);
/*for(i=0;i<n;i++)
{
if(s[i]>0)
{
for(j=1;j<n;j++)
{
if(s[i]==0)
break;
if(i-j>=0&&s[i-j]<0)
{
//if(s[i-j]+s[i]<0)
//{
s[i-j]+=s[i];
sum+=(j)*s[i];
s[i]=0;
/* }
else
{
s[i]+=s[i-j];
sum+=-j*s[i-j];
s[i-j]=0;
}*/
/* }
if(i+j<n&&s[i+j]<0)
{
//if(s[i+j]+s[i]<0)
//{
s[i+j]+=s[i];
sum+=(j)*s[i];
s[i]=0;
/*}
else
{
s[i]+=s[i+j];
sum+=-j*s[i+j];
s[i+j]=0;
}*/
/* }
}
}
}
printf("%lld\n",sum);*/
}
return 0;
}