UVa 11054 Gergovia的酒交易

https://vjudge.net/problem/UVA-11054

题意:直线上有n个等距的村庄,每个村庄要么买酒,要么卖酒。设第i个村庄对酒的需求为ai,ai>0表示买酒,ai<0表示卖酒,所有村庄供需平衡。把k个单位的酒从一个村庄运到相邻村庄需要k个单位的劳动力。计算所需最少劳动力。

思路:从左边第一个开始分析,如果它卖酒,则可以把它全卖给第二个村庄,如果它买酒,可以从第二个村庄那里买酒,依次下去分析第二个直到最后一个村庄。这样的话每次买酒和卖酒的距离都是最短的,劳动力肯定也是最少的。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5
 6 const int maxn = 100000 + 5;
 7
 8 int n;
 9 int ans[maxn];
10 long long k;
11
12 int main()
13 {
14     //freopen("D:\\txt.txt", "r", stdin);
15     while (cin >> n && n)
16     {
17         for (int i = 0; i < n; i++)
18             cin >> ans[i];
19         k = 0;
20         for (int i = 0; i < n - 1; i++)
21         {
22             ans[i + 1] = ans[i + 1] + ans[i];
23             k += abs(ans[i]);
24         }
25         cout << k << endl;
26     }
27
28     return 0;
29 }
时间: 2024-12-25 22:35:00

UVa 11054 Gergovia的酒交易的相关文章

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 11054 Gerovia的酒交易(贪心+树状数组)

直线上有n个等距的村庄,每个村庄要么买酒,要么卖酒.把k个单位的酒从一个村庄运到相邻村庄需要k个单位的劳动力.问最少需要多少劳动力才能满足所有村庄的需求 思路贪心 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #inclu

Gergovia的酒交易B805(移动纸牌)

试题描述 直线上有 n 个等距的村庄,每个村庄要么买酒,要么卖酒.设第 i 个村庄对酒的需求为 ai (-1000<=ai<=1000),其中ai>0表示买酒,ai<0表示卖酒.所有村庄供需平衡,即所有 ai 之和等于0.把 k 个单位的酒从一个村庄运到相邻村庄需要 k 个单位的劳动力.计算最少需要多少劳动力可以满足所有村庄的需求.输出保证在 64 位带符号整数的范围内. 输入 若干组数据,每组数据为两行.对于每组数据,第一行有一个整数N,表示有N个酒窖,第二行有N个整数,从a1,

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(等价转换)

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

UVA 11054 The Necklace 转化成欧拉回路

题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的. 这个时候数学建模就真的好重要了,如果我们能把颜色作为节点,一个碎片就表示两个节点连了一条路,那其实就是走了一遍欧拉回路,就意味着项链做成了. 太叼了,这个思想真心不错...LRJ书上的提示,否则我还真是想不到可以这样. 不过还有

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 (归纳【好吧这是我自己起的名字】)——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(算法效率--等价转换)

题意: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<