zoukankan      html  css  js  c++  java
  • UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟

    题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求最小路费。


    在纸上模拟了一下,你会发现一家店如果卖酒,它的最终流向就是向两边运送;如果买酒,那它就在那边等别家店送酒过来。(我在废话。。。)

    然后第一家店肯定是向边运酒了,最小的运费当然是卖给尽量近的店了,然后第一家店的供求就为0,不需要再考虑了,这样就变成后面几家去买卖的子问题了。

    这样是可以解的,但是问题是数据量为10W,而这样解复杂度为O(n^2),必须超时。

    然后可以根据这个思路再模拟一下,你会发现其实酒都是向右移动的,其实,这些各个卖家的酒的移动都可以同时算的:

        把第一家的酒交给下一家,路费就是酒×1了;或者把负数的酒交给下一家,表示待会计算下家时有酒了就会反方向运过来,路费也是酒x1。然后继续下一家,由于上一家运费和供求都处理完了,第二家也可以同样处理它的当前供求。

    以此类推,模拟一遍就能求出总路费了。

    代码:

     /*
     *   Author:        illuz <iilluzen@gmail.com>
     *   Blog:          http://blog.csdn.net/hcbbt
     *   File:          Uva11054.cpp
     *   Lauguage:      C/C++
     *   Create Date:   2013-08-30 19:41:05
     *   Descripton:    UVA 11054 Wine trading in Gergovia, greed, simutation
     */
    #include <cstdio>
    #include <iostream>
    using namespace std;
    typedef long long LL;
    
    int main() {
    	int n, t, s;
       	LL cnt;
    	while (scanf("%d", &n) && n) {
    		s = cnt = 0;
    		while (n--) {
    			scanf("%d", &t);
    			s += t;
    			cnt += s > 0 ? s : -s;
    		}
    		cout << cnt << endl;
    	}
    	return 0;
    }
    


  • 相关阅读:
    针对上一篇文章中的代码,想出的重构方案(python实现)
    Android中的广播Broadcast详解
    Android中的Serialable和Parcelable的区别
    Java中的序列化Serialable高级详解
    Android中的Parcel机制(下)
    Android中的Parcel机制(上)
    Java中获取前一天和后一天时间
    Android中的Service详解
    Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
    Java高新技术第三篇:注解的使用
  • 原文地址:https://www.cnblogs.com/pangblog/p/3294097.html
Copyright © 2011-2022 走看看