题目:http://acm.hdu.edu.cn/showproblem.php?pid=1489
题意:为负数表示买酒,正数表示买酒,每两家人之间为one unit of work.问最小的work
思路:从左向右依次把久给离自己最近的买卖家就好。
代码算法原理如下:
以题目举的例子为例:
5
5 -4 1 -3 1
5 -5+1 -1+2 -2-1 1+0
{(5 -5)+(1 -1)+(2 -2)-(1 1)+0}
每个数都可以拆分成如上两个数,相邻的两个数 互相供应。(之所以可以这样拆,是因为题目的要求:one unit of work.)
从左到右,计算的过程为:5+|1|+|2|+|-1|+|0|=9,实际就是5 .-5,1.-1,这样成对的数,依次加一个就好。
扩展:
绝对值:
#include
int abs(int i); // 处理int类型的取绝对值
double fabs(double i); //处理double类型的取绝对值
float fabsf(float i); /处理float类型的取绝对值
code:
#include <iostream>
#include <stdio.h>
#include <stdlib.h> using namespace std; int main()
{
int n, a;
while(cin>>n && n) {
long long sum = , ans = ; for(int i=; i<=n; i++) {
scanf("%d", &a); sum += a;
ans += abs(sum);
} cout<<ans<<endl;
} return ;
}