【uva 11054】Wine trading in Gergovia(算法效率--等价转换)

题意:N个等距村庄,买(>0)卖(<0)酒,供需平衡,运K则需K劳动力。问所需的最小劳动力。

解法:由于运出或运入1的都需经过2,所以无论如何,都可以等价于从2本身运入或运出。因此可以将1和2合并,2一定要运a1(小心:确保 i 的劳动力消耗量是由 i 之前,即 i-1 得到的),记a1+a2为现在自己的所需量。其他同理。

注意——理清关系,算劳动力时要用绝对值。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 typedef long long LL;
 7
 8 LL mabs(LL x) {return x>0?x:-x;}
 9 int main()
10 {
11     int n;
12     while (1)
13     {
14       scanf("%d",&n);
15       if (!n) break;
16       LL x,last=0,ans=0;
17       for (int i=1;i<=n;i++)
18       {
19         scanf("%lld",&x);
20         ans+=mabs(last);
21                 last+=x;
22       }
23       printf("%lld\n",ans);
24     }
25     return 0;
26 }
时间: 2024-12-28 01:20:48

【uva 11054】Wine trading in Gergovia(算法效率--等价转换)的相关文章

UVa 11054 Wine trading in Gergovia(扫描)

题意  有n个村庄  第i个村庄需要买a[i]的酒   a[i]为负时该村庄可卖掉-a[i]的酒  保证所有a[i]的和为0   一个单位的酒从一个村庄运输到相邻村庄的消耗为1  求运输完所有酒需要的最小消耗 总消耗最少时  每个需要买的村庄都会找离他最近的可以卖的村庄  容易发现  这种状况下  从第一个村和第二个村庄之间的运输量为abs(a[1])  第二个村庄和第三个村庄之间的运输量为abs(a[1]+a[2])   第k个村庄到第k+1个村庄的运输量为abs(a[1]+a[2]+...+

(白书训练计划)UVa 11054 Wine trading in Gergovia(等价转换)

题目地址:UVa 11054 很巧妙的一道题,这题是利用的等价转换,对每一条路来说,假如右边生产的比左边的多x,那么不管起点是哪,终点是哪,都可以把左右两侧的看成两个点,要从这条路上运送x个劳动力.再由于总和是0,所以只需要算出一端的总和就可以,这样只要遍历一遍就可以算出来了.写出代码就很简单了... 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.

uva 11054 wine trading in gergovia (归纳【好吧这是我自己起的名字】)——yhx

As you may know from the comic \Asterix and the Chieftain's Shield", Gergovia consists of one street,and every inhabitant of the city is a wine salesman. You wonder how this economy works? Simpleenough: everyone buys wine from other inhabitants of th

UVA - 11054 Wine trading in Gergovia (Gergovia 的酒交易)(贪心+模拟)

题意:直线上有n(2<=n<=100000)个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai(-1000<=ai<=1000),其中ai>0表示买酒,ai<0表示卖酒.所有村庄供需平衡,即所有ai之和等于0.把k个单位的酒从一个村庄运到相邻村庄需要k个单位的劳动力.计算最少需要多少劳动力可以满足所有村庄的需求. 分析:从最左面的村庄考虑,不管他是买酒还是卖酒,相对于他的相邻村庄都会有a0的运输量,所以运输量不断累加或抵消,一直算到最右边村庄即可.

UVa 11054 Wine trading in Gergovia

题意: 直线上有n个等距的酒庄,每个酒庄对酒的需求量为ai(正数说明需要买酒,负数需要卖酒),而且保证所有的酒庄供需平衡. 搬运x个单位的酒到相邻的酒庄需要x个劳动力,求要使所有酒庄供需平衡最少需要多少劳动力. 分析: 第一个酒庄要买a1个单位的酒,那么这些酒可能是直接由第二个酒庄生产的,也可能是其他酒庄运到第二个酒庄的. 但最终一定有a1个 劳动力把酒从酒庄2运到酒庄1. 于是,问题就转化为: 有2~n这些酒庄,酒庄2的需求量为a1+a2,其他酒庄的需求量还是ai.且已经使用了|a1|个劳动力

UVA 11054 Wine trading in Gergovia(思维)

题目链接: https://vjudge.net/problem/UVA-11054 1 /* 2 问题 输入村庄的个数n(2=<n<=100000)和n个村庄的数值,正代表买酒,负代表卖酒,k个单位的酒移动到相邻村需要k个单位的劳动力, 3 计算并输出至少需要多少个劳动力 4 解题思路 模拟,每个需要卖酒的村庄,向两边搜索买酒的地方,谁的多或者直接能够满足就移动谁的,直到所有村庄均满足条件. 5 最坏的情况下,每个村庄都搜索到最远,n*n,可能超时,另外不可行,因为搜索的时候先后的顺序很难确

11054 - Wine trading in Gergovia

这道题非常的灵活..乍一看好像很麻烦,需要搜索,但是实际上对酒的需求量和劳动力是一样的,可以利用这点,从左向右一次扫描每一个村庄,用last表示当前村庄的对酒的需求情况(到最后一个时,last必定为0)然后就相当于他要向下一个村庄转移这么多酒,即需要花费这么多的劳动力. #include<bits/stdc++.h> using namespace std; int n; int main(){ while(~scanf("%d",&n)&&n){

UVA 11054 Gergovia的酒交易 Wine trading in Gergovia

一道思维题,主要用到的方法是思路转化. 首先考虑第一个村庄,首先他本身一定会用|a[1]|的劳动力 a[1]>0 那么2村庄一定要花a[1]的劳动力来运输,也就是需要a[1]+a[2]的劳动力 a[1]<0 那么2村庄就已经有-a[1]瓶酒,就可以不用去买了,也就是a[2]-(-a[1])=a[1]+a[2] 综上,我们通过扫描法来记录前几个村庄带给这个村庄的酒,累加劳动力就好了 #include<bits/stdc++.h> using namespace std; int n;

【uva 11134】Fabled Rooks(算法效率--问题分解+贪心)

题意:要求在一个N*N的棋盘上放N个车,使得它们所在的行和列均不同,而且分别处于第 i 个矩形中. 解法:问题分解+贪心. 由于行.列不相关,所以可以先把行和列均不同的问题分解为2个“在区间[1,n]中选择n个不同的整数,使得第 i 个整数在[Li,Ri]内”的问题. 接下来的贪心很重要:先使区间R从小到大排序,再L.这样在每个合法区间段中尽量往左边选数的情况下,就能保证每个区间的右边一段是灵活合法的,而若R1=R2,由于是从左开始填数,这并不影响.反正我是没有找到反例的......而不像我(