UVA-11054-Wine trading in Gergovia(模拟+贪心)

首先这道题的节点数太多了,达到10^5,所以不能用数组模拟啊,肯定TLE,所以用贪心算法,读取第一个结点,搬到第二个结点,剩下的和第二个结点合并,一起搬到第三个结点。。。。。。这个算法很好,每次看成只是邻居间买卖,下面是代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n && n)
    {
        long long temp,now,sum = 0;
        cin>>temp;
        for(int i = 1;i < n;i++)
        {
            cin>>now;
            sum += abs(temp);
            now += temp;
            temp = now;
        }
        cout<<sum<<endl;
    }
    return 0;
}

UVA-11054-Wine trading in Gergovia(模拟+贪心)

时间: 2024-10-11 18:29:01

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 (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 (归纳【好吧这是我自己起的名字】)——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(思维)

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

UVa 11054 Wine trading in Gergovia

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

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(等价转换,贪心法)

这个题看上去麻烦,实际上只要想清楚就很简单.关键是要有一种等价转换的思维方式.其实题意就是个一排数,最后通过相邻的互相移动加减使得所有数都变成零,移动过程中每次都耗费相应值,让耗费的值最小.虽然从实际看来只能从负的移给正的,但实际结果谁给谁消耗的都一样. 有了这些等价思考,就可以用贪心法做了:第一个数要想变成0,那么必须和第二个数相互移,那么不管谁移给谁,消耗的就是第一个数的绝对值,最后第一个数变0,第二个数变a[1]+a[2]了.这样第2至n个数还是这样的思考方式.这种做法的每一步的消耗都是必