HDU - 6438 Buy and Resell(思维+ 贪心)
题目链接
题意
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(思维+ 贪心)相关推荐
- HDU 6438 Buy and Resell【贪心】
http://acm.hdu.edu.cn/showproblem.php?pid=6438 Problem Description The Power Cube is used as a stash ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- 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 ...
- Buy and Resell hdu-6438 贪心 优先队列
题目链接:Problem - 6438 题面: 题意:你按顺序去n个城市,每个城市商品买入和卖出的价格一样,你可以用一天时间买入或者卖出,问最多可以获取多少钱,已经最少的天数 思路:在每个位置处贪心寻 ...
- HDU - 6438(贪心+思维)
链接:HDU - 6438 题意:给出 n ,表示 n 天.给出 n 个数,a[i] 表示第 i 天,物品的价格是多少.每天可以选择买一个物品,或者卖一个已有物品,也可以什么都不做,问最后最大能赚多少 ...
- Buy and Resell(贪心好题!)
这个贪心可以说是很巧妙了. Buy and Resell Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
题目传送门 题目描述: 有n座城市,每座城市都可以对一个物品进行一次的买进或者卖出,可以同时拥有多个物品,计算利润最大值,并且交易次数要最少.(买入卖出算两次操作) 思路: 建立两个小根堆 优先队列, ...
- Buy and Resell
题目链接: Buy and Resell 大致题意: 有n个城市, 在每个城市中你可以选择花费a[i]的价格买一个能量块, 也可以选择以a[i]的价格卖出一个能量块(前提是你要有能量块可以卖). 你会 ...
- HDU6348 Buy and Resell
Bryce1010模板 HDU6348 Buy and Resell 题意: 从前往后开始旅游,在每个村庄可以选择三个操作: (1)买入物品 (2)卖出物品 (3)不买不卖 求最后的最大获益. 思路: ...
最新文章
- 打开Office时出现“运行时错误91”问题的解决办法
- 微信自定义内置返回事件
- ArrayList的泛型可以不写吗
- Spark RDD算子介绍
- raid0 raid1 raid5 raid10工作模式的工作原理及特点
- 漫步数学分析三十一——矩阵表示
- 买房一定要知道的购房误区 买涨不买跌的心态可能得改
- PAT乙级(1009 说反话)
- 洛谷P3261 [JLOI2015]城池攻占(左偏树)
- 【MYSQL笔记】修改表
- c if语句多个条件判断顺序_IF函数和IFS函数的应用对比
- 设计模式-工厂模式-3种-以手机制造工厂为例
- 【闸机】KEIL安装pack包
- ftp服务器上传显示550,ftp上传文件服务器报550
- 代码本色 processing编程练习
- 2021-09-10 参数计算
- Arrays.aslist新建的list集合不能add()、remove()你知道吗?
- 杂谈对抽象事物的审美——繁体字与简体字,孰美?
- 把数据库中的数据写出到excel表格中
- devexpress15.2汉化包及教程