题目链接: Buy and Resell

大致题意:

有n个城市, 在每个城市中你可以选择花费a[i]的价格买一个能量块, 也可以选择以a[i]的价格卖出一个能量块(前提是你要有能量块可以卖). 你会从1号城市依次走到n号城市, 每次可以选择买或者卖或者什么也不做. 在初始你有无限多的钱的前提下, 问你能获得的最大利润, 以及在最大利润的前提下最小的买卖次数.

解题思路:

首先如果一件物品买了后再卖了能赚钱, 则我们一定会采取这种方案, 因为题目要求最大利润优先, 最小的买卖次数则是不做无意义的买卖, 如花费x元购买能量块后又以x元卖出.

贪心思路:

因为我们难以决定在第i个城市我们采取怎么样的操作是最优的, 所以不妨对于每一个城市, 我们都认为我们可以从该城市买入能量块, 并且在j城市(j>i)卖出(但是在卖出之前, 我们认为我们在i城市什么也没做). 而j城市的能量块价格是一定为a[j]的, 所以此时我们如果要卖出能量块, 一定要以最小的价格在i城市买入能量块. 对于买入能量块的城市i, 我们可以采用小顶堆来维护, 而城市j的确定则是难点.

假设我们现在存在一个小顶堆, 里面存放的元素代表可以用x的价格买入能量块(即所有的i城市), 当我们到达j城市, 此时如果满足a[j] > heap.top(), 我们此时选择卖出一定可以赚到钱, 且为一种优质策略.
此时我们的利润变化为: res = res + a[j] - x. (记为*式)

但是我们无法保证后续不会存在城市k (k>j), 满足a[k] > a[j], 则我们发现不如在k城市卖出刚才的能量块, 所以我们此时就要有一种反悔策略, 即: 刚才的能量块不选择在j城市卖出(即我们又可以以a[j]的价格买入能量块, 应当把a[j]入堆), 而在k城市卖出该能量块. 本身我们花费了x元买入, 卖出得到了a[j]元, 变成了x元买入, a[k]元卖出. 则利润变化为: res = res - a[j] + a[k]. 做一个变形, 类比于*式, 我们得到 res = res + a[k] - a[j].
从操作次数的角度看, 我们在j城市买入能量块, 在k城市卖出, 结合之前i城市的操作, 相当于我们在j城市卖了一次, 又买了一次. 所以在j城市的操作并不是合法操作, 不应计算在结果中.

而从利润的角度看, 我们获得的利润可以看作买了i, 在j卖出, 又在j买入, 在k卖出. 我们发现这两种情况的利润遵循相同的公式.

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{int t; scanf("%d", &t);while (t--) {int n; scanf("%d",&n);priority_queue<int, vector<int>, greater<int>> q; //小顶堆map<int, int> mp; //first:价格, second:反悔次数 (也可以以城市编号来标记是否可以反悔)ll res = 0, cou = 0; //res表示利润, cou表示操作次数for (int i = 1; i <= n; ++i) {int x; scanf("%d", &x);if (!q.empty() && q.top() < x) { //说明应当卖出堆顶元素int sell = q.top(); q.pop();res += x - sell; //利润变化if (mp.count(sell)) { //看看当前城市属于j城市还是k城市//属于k城市if (--mp[sell] == 0) mp.erase(sell); //已经卖出过了, 需要反悔q.push(sell); //j城市的商品我们仍可以购买}else cou++; //买卖次数++mp[x]++; //既然在当前城市卖出了能量块, 那么对于价格x, 我们就可以反悔.}q.push(x);}printf("%lld %lld\n", res, cou * 2);}return 0;
}

END

Buy and Resell相关推荐

  1. hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心

    题目传送门 题目描述: 有n座城市,每座城市都可以对一个物品进行一次的买进或者卖出,可以同时拥有多个物品,计算利润最大值,并且交易次数要最少.(买入卖出算两次操作) 思路: 建立两个小根堆 优先队列, ...

  2. Buy and Resell(贪心好题!)

    这个贪心可以说是很巧妙了. Buy and Resell Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  3. HDU6348 Buy and Resell

    Bryce1010模板 HDU6348 Buy and Resell 题意: 从前往后开始旅游,在每个村庄可以选择三个操作: (1)买入物品 (2)卖出物品 (3)不买不卖 求最后的最大获益. 思路: ...

  4. 2018中国大学生程序设计竞赛 – 网络选拔赛 1001 Buy and Resell [模拟]

    1001 Buy and Resell  题目:有1-n个货物,可以在某个点buy,然后在后面的点resell,可以同时买多个,问最大的利润和最小的交易次数. 题解:模拟运算,前 i 天都是可以买的, ...

  5. Buy and Resell HDU - 6438(补)更新贪心

    The Power Cube is used as a stash of Exotic Power. There are nn cities numbered 1,2,-,n1,2,-,n where ...

  6. HDU 6438 Buy and Resell【贪心】

    http://acm.hdu.edu.cn/showproblem.php?pid=6438 Problem Description The Power Cube is used as a stash ...

  7. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  8. HDU6438 Buy and Resell

    题目链接:https://cn.vjudge.net/problem/HDU-6438 知识点: 贪心 题目大意: 本题讨论的是同一种物品的买卖.有 n 天,每一天这种物品都有一个价格.每天可以选择购 ...

  9. HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)

    写在前面 此题是一个很容易想到的贪心题目,但是正确性的证明是非常复杂的.然而,目前网上所有题解并未给出本题贪心算法的任何正确性证明,全部仅停留在描述出一个贪心算法.本着对算法与计算机科学的热爱(逃), ...

最新文章

  1. 界面Hello world
  2. ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决办法
  3. 985学校计算机专业毕业月薪过万,这八个985和211大学分数低,容易考,毕业后月薪过万...
  4. Qt中多线程间的同步
  5. Android性能优化典范
  6. PHP小白学习日程之旅
  7. linux重新加载php.ini,linux修改php.ini后重新加载配置文件命令
  8. 这轮AI才刚刚启动,就开始有人谈AI泡沫了?
  9. “手把手教你学linux驱动开发”OK6410系列之01---模块编程
  10. 解决微信浏览器无法使用reload()刷新页面
  11. NO.3 寻找数组主要元素
  12. python 模拟键盘按键错乱_python 采坑总结 调用键盘事件后导致键盘失灵的可能原因...
  13. 后端返回图片二进制流,前端处理
  14. MySQL - 基于ibd文件恢复表数据
  15. WCDMA空口速率和Iub口速率的计算方法和限制
  16. 唱吧android逆向加密算法笔记 此文章已做脱敏处理不会对原厂家app安全构成威胁,仅供学习
  17. [开题报告+任务书+论文+PPT+源码]基于安卓的个人图书馆设计[包运行成功]
  18. UrlRewritingNet实现ASP.net 2.0中URL重写(映射)
  19. uniapp 模块权限配置 权限管理中英对照
  20. jiffies:内核中的时间观念

热门文章

  1. 从纯洁男孩到堕落男人
  2. 计算机 黑屏 显示桌面,电脑开机后显示桌面黑屏了怎么处理啊?
  3. 自己开发iOS版按键精灵--TTouch
  4. URI跳转方式地图导航的代码实践
  5. 计算机网络(三)—— 数据链路层(7):MAC地址、IP地址以及数据链路层使用的ARP协议
  6. 促活用户新方式:在app内嵌入小游戏
  7. 2022年1~8月语音合成(TTS)和语音识别(ASR)论文月报
  8. 湖北移动B863AV3.1-M2_S905L3A_UWE5621DS_安卓9语音线刷包--支持语音-首页正常-设置不要密码-灯正
  9. 怎么去除新装修房子的甲醛
  10. 【转发】SAP ABAP ZBA_R001 查询用户下的角色