您的位置:首页 > 编程语言 > Go语言

UVa 11054 - Wine trading in Gergovia

2017-06-15 09:40 411 查看
题目:有一些等距排列在一条直线上的酒店,他们之间互相运送酒,供求相符,

            每次运送以箱酒的代价为两家店的距离,求满足供求关系的总运送代价最小值。

分析:贪心。可以采用需求或提供的量求解,这里使用需求量求解。

            如果正数和负数分别在两端,那么无论怎么对应总代价相同;

           (如:-a, -b, a b,可以变成0, -b, 0, b或0, -b, a, b-a,假设a<b,代价都是2a+2b)

            如果交替分成块,只要不交叉运送酒和上面形同,即分成子段,每段为正负分离;

           (如果交叉运送,会出现额外代价,增加总代价)

            这里利用need记录前部分子段的总需求,如果need为正,说明需要后面补给;

            如果need为负数,说明供过于求,这时直接向后面的子部分移动。

说明:感觉说都不会话了:-(。

#include <stdio.h>
#include <stdlib.h>

int inhabitants[100001];

int main()
{
int n;
while (~scanf("%d",&n) && n) {
for (int i = 0; i < n; ++ i) {
scanf("%d",&inhabitants[i]);
}
long long need = 0LL, ans = 0LL;
for (int i = 0; i < n; ++ i) {
if (need < 0) {
ans -= need;
}else {
ans += need;
}
need -= inhabitants[i];
}

printf("%lld\n",ans);
}

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: