题目链接

题意

t组输入,每组n个城市,给出每个城市的货物的价格,在每个城市可以进行三个操作:购买货物,卖出货物,不做操作,问从城市1到城市n(不能返回)最多能获得多少利润,且操作数最少(买和卖分别算一次操作)。

思路

首先,对于 1 2 10,我们可以这样考虑:在1号城市买入,在2号城市卖出,利润为2-1 = 1,但是我们发现3号城市利润更高,所以在2号城市的时候我们假装买入一份价格为2的货物,然后在3号卖出,重述一次整个过程:城市1买入(-1),城市2卖出(-1+2),城市二买入(-1+2-2),城市三卖出(-1+2-2+10 = 9),其实就相当于在1号买入,3号卖出,2号城市当作跳板,同样,操作数就算2次,那么我们可以把货物分成两类——直接购买的货物,当作跳板虚假买入的货物,那么直接购买的货物卖出后操作数就是2,跳板货物对操作数没有影响,所以操作数为0。如此,我们可以想到用一个优先队列维护一个结构体,结构体里存货物价格和类型(对操作数的影响,0或2),按照先价格从小到大,再类型从小到大的顺序出队。遍历一次所有城市,如果当前城市的价格大于队内最小的价值,说明卖出有利润,卖出并pop掉,再压入当前城市价格的两种类型的货物(具体看代码),最后输出即为答案。

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define LL long long
using namespace std;
const int maxn = 1e5 + 10;
const double PI = acos(-1.0);struct node {int val, type;bool operator<(const node b) const {//重载符号,达到先按照价格后按照类型从小到大排列if (val != b.val) return val > b.val;return type > b.type;}
};priority_queue<node> q;
int main(int argc, char const *argv[]) {ios::sync_with_stdio(false);int t;cin >> t;while (t--) {while (!q.empty()) q.pop();int n;cin >> n;LL ans = 0, cnt = 0;while (n--) {int x;cin >> x;node p;p.val = x;p.type = 2;if (!q.empty() && q.top().val < x) {//如果队内最小价格小于当前城市的价格,说明有利可图,卖出ans += x - q.top().val;cnt += q.top().type;q.pop();q.push(p);//压入两种类型的货物p.type = 0;//当前货物可能是当作跳板卖出的,所以也要压入跳板q.push(p);} elseq.push(p);//当前城市不卖出货物,只有可能买入,故压入类型为操作数为2的货物}cout << ans << ' ' << cnt << endl;}return 0;
}

HDU - 6438 Buy and Resell(思维+ 贪心)相关推荐

  1. HDU 6438 Buy and Resell【贪心】

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

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

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

  3. 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 ...

  4. Buy and Resell hdu-6438 贪心 优先队列

    题目链接:Problem - 6438 题面: 题意:你按顺序去n个城市,每个城市商品买入和卖出的价格一样,你可以用一天时间买入或者卖出,问最多可以获取多少钱,已经最少的天数 思路:在每个位置处贪心寻 ...

  5. HDU - 6438(贪心+思维)

    链接:HDU - 6438 题意:给出 n ,表示 n 天.给出 n 个数,a[i] 表示第 i 天,物品的价格是多少.每天可以选择买一个物品,或者卖一个已有物品,也可以什么都不做,问最后最大能赚多少 ...

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

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

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

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

  8. Buy and Resell

    题目链接: Buy and Resell 大致题意: 有n个城市, 在每个城市中你可以选择花费a[i]的价格买一个能量块, 也可以选择以a[i]的价格卖出一个能量块(前提是你要有能量块可以卖). 你会 ...

  9. HDU6348 Buy and Resell

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

最新文章

  1. 打开Office时出现“运行时错误91”问题的解决办法
  2. 微信自定义内置返回事件
  3. ArrayList的泛型可以不写吗
  4. Spark RDD算子介绍
  5. raid0 raid1 raid5 raid10工作模式的工作原理及特点
  6. 漫步数学分析三十一——矩阵表示
  7. 买房一定要知道的购房误区 买涨不买跌的心态可能得改
  8. PAT乙级(1009 说反话)
  9. 洛谷P3261 [JLOI2015]城池攻占(左偏树)
  10. 【MYSQL笔记】修改表
  11. c if语句多个条件判断顺序_IF函数和IFS函数的应用对比
  12. 设计模式-工厂模式-3种-以手机制造工厂为例
  13. 【闸机】KEIL安装pack包
  14. ftp服务器上传显示550,ftp上传文件服务器报550
  15. 代码本色 processing编程练习
  16. 2021-09-10 参数计算
  17. Arrays.aslist新建的list集合不能add()、remove()你知道吗?
  18. 杂谈对抽象事物的审美——繁体字与简体字,孰美?
  19. 把数据库中的数据写出到excel表格中
  20. devexpress15.2汉化包及教程

热门文章

  1. KeyError问题求助
  2. css加密数据 图片解析破解
  3. Arcgis For Android实现比例尺
  4. IDEA及PyCharm用校园邮箱申请使用及延长方法
  5. 微信预览wx.previewImage黑屏
  6. 坚果手机2系统相册问题
  7. Cobbler自动化安装系统2
  8. 为什么有阿里云ACP认证好找工作呢?
  9. opencv 脸部识别开源软件
  10. Spark MLlib特征处理:MinMax最大最小值区间缩放---原理及实战