博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟
阅读量:4564 次
发布时间:2019-06-08

本文共 1063 字,大约阅读时间需要 3 分钟。

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

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

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

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

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

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

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

代码:

 

/* *   Author:        illuz 
* 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
#include
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;}

 

 

转载于:https://www.cnblogs.com/pangblog/p/3294097.html

你可能感兴趣的文章
php,字符串(二)
查看>>
easyui validatebox 验证类型
查看>>
编程迷茫时候看一看
查看>>
“ORA-00913: 值过多”、“ORA-00911: 无效字符”
查看>>
编程中的那些容易迷糊的小知识
查看>>
Sizzle前奏
查看>>
Paint Chain HDU - 3980(sg)
查看>>
Chales常用操作
查看>>
C++ 运算符重载<<
查看>>
windows镜像
查看>>
Flask 模板语法
查看>>
ZOJ FatMouse' Trade 贪心
查看>>
音乐播放器
查看>>
SQL COOKBOOK (Ch.1-10)
查看>>
创建数组
查看>>
dict使用
查看>>
[转] 移动平台Html5的viewport使用经验
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
《Python数据科学手册》第五章机器学习的笔记
查看>>
ubuntu16.04 配置爬虫环境
查看>>