UVa 11054 例题8-5 Gergovia的酒交易

本文介绍了一个有趣的UVa-11054算法问题,该问题涉及一个一维村庄中买卖酒的行为,并要求设计一种算法来最小化每日送货所需的人力。文章详细解释了解题思路,即通过贪心算法确定最优配送方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接: UVa-11054

题目大意:

  一个形状是一条直线的村庄(别问为什么他们的村庄是条直线,我也不知道,可能他们的次元是一维的吧),这还不算奇怪,更奇怪的是,这个村庄所有的经济活动就只有买酒和卖酒,每家人每天早上起来第一件事情就是觉得今天都要决定两件事:1、卖酒还是买酒 2、多少酒。而且每天都能供销平衡(神奇吧!),而且卖家和买家都不挑。但是一直以来有个问题,送酒需要人力,但是他们都特别懒,不想多跑,所以他们想让你帮他们设计一种每天送酒的方式能让他们耗费的人力(一人力是送一桶酒到一个相邻村庄耗费的能力)最少。(MDZZ)

解题思路:

 看完题觉得应该用贪心算法,但是不知道该怎么贪,就看了紫书给的分析。瞬间茅塞(ce)顿开,思路一泻千里。


 理论:假设最左边的那一户a今天很懒,不想做酒了,决定今天买酒a桶,无论怎么样,肯定是要用从他右侧邻居b那里得到a桶,假设他的邻居家要b桶,则他的邻居b肯定要从b右侧的邻居那里得到a+b(自己需要的和a需要的)。当a户决定卖酒时也是一样的这时a是负的,但是同样需要a个人力运送酒到b。只是方向不一样,不过方向无关紧要。这样就能算出来最少(最少是因为肯定是从自己邻居那里得到酒,需要的人力才是最少的)需要多少人力。

代码:

//E8-5 UVa11054 AC 
#include<iostream>
#include<cmath>

using namespace std;

int main()
{
	int n, num, m = 0;
	while (cin >> n && n) {
		long long cnt = 0;
		while (n--) {
			cin >> num;
			m += num;
			cnt += abs(m);
		}
		cout << cnt << endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值