UVa 11054 Wine trading in Gergovia

题意:

直线上有n个等距的酒庄,每个酒庄对酒的需求量为ai(正数说明需要买酒,负数需要卖酒),而且保证所有的酒庄供需平衡。

搬运x个单位的酒到相邻的酒庄需要x个劳动力,求要使所有酒庄供需平衡最少需要多少劳动力。

分析:

第一个酒庄要买a1个单位的酒,那么这些酒可能是直接由第二个酒庄生产的,也可能是其他酒庄运到第二个酒庄的。

但最终一定有a1个 劳动力把酒从酒庄2运到酒庄1.

于是,问题就转化为:

有2~n这些酒庄,酒庄2的需求量为a1+a2,其他酒庄的需求量还是ai。且已经使用了|a1|个劳动力,求还需最少劳动力。

其实,无论正数负数都符合这个转化。

于是,我们边读边算就可以了。

因为数据量比较大,于是我机(wei)智(suo)地用了个输入挂,果然快了很多。

 1 #include <cstdio>
 2 #include <cmath>
 3
 4 long long Scan() {    //输入外挂
 5     int res = 0, flag = 0;
 6     char ch;
 7     if((ch = getchar()) == ‘-‘) flag = 1;
 8     else if(ch >= ‘0‘ && ch <= ‘9‘) res = ch - ‘0‘;
 9     while((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)
10         res = res * 10 + (ch - ‘0‘);
11     return flag ? -res : res;
12 }
13
14 int main()
15 {
16     //freopen("in.txt", "r", stdin);
17
18     int n;
19     while(scanf("%d", &n) == 1 && n)
20     {
21         getchar();
22         long long ans = 0, last = 0;
23         int a;
24         for(int i = 0; i < n; ++i)
25         {
26             a = Scan();
27             ans += std::abs(last);
28             last += a;
29         }
30
31         printf("%lld\n", ans);
32     }
33
34     return 0;
35 }

代码君

时间: 2024-08-24 01:04:34

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(思维)

题目链接: 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】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<

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;

UVa11054 Wine trading in Gergovia (等价转换)

链接:http://vjudge.net/problem/UVA-11054 分析:买酒和卖酒是平衡的,ai>0表示买酒,ai<0表示卖酒,所有ai之和等于0.之后就是一个思维转换,见代码. 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int main() { 6 int n; 7 while (cin >> n && n) { 8 long long