NKOJ3569 葡萄酒交易
时间限制 : 10000 MS 空间限制 : 65536 KB
问题描述
一条笔直公路上分布着n(2<=n<=300000)个村庄,从左往右编号1到n,每个村庄要么需要买酒,要么需要卖酒。
设第i个村庄对葡萄酒的需求为Ai(-1000<=Ai<=1000),其中Ai>0表示该村需要买酒,Ai<0表示该村需要卖酒。所有村庄供需平衡,即所有Ai之和等于0
把k升葡萄酒从一个村庄运到相邻村庄需要k块钱的运费,请你计算最少需要多少运费就可以满足所有村庄对酒的需求。结果保证在64位整数范围以内。
输入格式
第一行,一个整数n,表示村庄的数量
第二行,n个空格间隔的整数,依次表示1到n号村庄对酒的需求
输出格式
一行,一个整数,表示最小的费用
样例输入
样例输入1:
5
5 -4 1 -3 1
样例输入2:
6
-1000 -1000 -1000 1000 1000 1000
样例输出
样例输出1:
9
样例输出2:
9000
提示
样例1说明:
从2号村庄将4升酒运往村庄1,花费4
从4号村庄将1升酒运往村庄3,花费1
从4号村庄将1升酒运往村庄1,花费3
从4号村庄将1升酒运往村庄5,花费1
总花费为9
第一个村庄只会向下一个要酒或买酒,第二个在给完或买完第一个村庄酒后会有一个新的需求量,需要第三个村庄满足…
综上,ans=sigma(abs(sun[i])) sum[i]为a[i]前缀合。
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n;scanf("%d",&n);
long long b,ans=0,need=0;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&b);
ans+=fabs(need);
need+=b;
}
printf("%I64d",ans);
}