HDU 6438"Buy and Resell"(贪心+优先级队列)
•参考资料
[1]:HDU6438(优先队列+思维)
•题意
有n个城市,第 i 天你会达到第 i 个城市;
在第 i 个城市中,你可以用 ai 元购买一个物品,或者用 ai 元卖掉一个物品,你可以同时保存多个物品。
最开始你身上没有物品,但是有无限的金钱;
让你求从城市 1 走到城市 n,最大的收益以及最少的交易次数。
•题解
假设你当前在第 i 个城市,这个城市的物价为 $a_i$ 元;
但是你要不要购买这个物品呢?
因为我们不确定第 i+1~n 个城市是否有物价高于 $a_i$ 的城市;
所以,我们可以选择先将 $\{i,a_i \}$ 加入购物车;
如果这之后存在更高物价的城市,就将 $\{i,a_i \}$ 下单,然后转手就卖;
假设第 j 个城市的物价 $a_j > a_i$;
那么,我们将 $\{i,a_i \}$ 下单,并以 $a_j$ 的价格出售,获得 $a_j-a_i$ 元的利润;
此时,第 $i,j$ 城市已经进行了一次操作,按理说不能在做其他操作了;
但是,如果你来到的下一个 k 城市的物价 $a_k > a_j > a_i$ 呢?
是不是将 $a_i$ 在此处卖更划算?
我们考虑一下,虽然 j 城市做了 卖 这个操作,但是我们还是可以将其加入到购物车中的;
因为,如果遇到比 $a_j$ 更大的物价,我们可以反悔一下,在第 j 个城市不出售 $a_i$;
而是在物价更高的 k 城市出售 $a_i$,这种决策才能获得更高的利润 $a_k-a_i$;
但是,你会发现 $a_k-a_i = (a_j-a_i)+(a_k-a_j)$,也就是说,就算是 $a_i$ 在 j 城市出售,也可以将 $\{ j,a_j \}$ 加入到购物车中;
只不过,在第 k 个城市出售 $a_j$ 并不是真的将 $a_j$ 卖出,而是将 $a_i$ 卖出;
但是,将 $a_i$ 卖出后,$a_j$ 依旧应该存在于购物车中,所以,我们要将 $\{ j,a_j\}$ 加入购物车两次;
并且,我们希望购物车按照从小到大的顺序排列,因为这样的话,遇到新城市,我们可以优先下单物件低的以此来获得更大的利润;
考虑到物品按照价格升序排列,我们可以用优先级队列;
•Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=1e5+; int n;
int a[maxn];
struct Heap
{
int v;
bool op;///op == 1 : 当前这个物品作为了中转物品
bool operator < (const Heap &obj)const
{
if(v != obj.v)
return v > obj.v;
return op < obj.op;///中转物品优先
}
};
priority_queue<Heap >q; void Solve()
{
while(!q.empty())
q.pop(); ll ans=;
int cnt=;
for(int i=;i <= n;++i)
{
if(!q.empty() && q.top().v < a[i])
{
Heap tmp=q.top();
q.pop(); ans += a[i]-tmp.v;
if(!tmp.op)///如果tmp为非中转物品,那么在此处就有一次交易操作
cnt++; q.push({a[i],true});
}
q.push({a[i],false});
}
printf("%lld %d\n",ans,cnt<<);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i); Solve();
}
return ;
}
HDU 6438"Buy and Resell"(贪心+优先级队列)的更多相关文章
- HDU 6709“Fishing Master”(贪心+优先级队列)
传送门 •参考资料 [1]:2019CCPC网络选拔赛 H.Fishing Master(思维+贪心) •题意 池塘里有 n 条鱼,捕捉一条鱼需要花费固定的 k 时间: 你有一个锅,每次只能煮一条鱼, ...
- HDU 6438 Buy and Resell ( 2018 CCPC 网络赛 && 贪心 )
题目链接 题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少? 分析 : 和 CF 867 ...
- HDU 6438 Buy and Resell
高卖低买,可以交易多次 维护一个优先队列,贪心 相当于每天卖出 用当前元素减优先队列最小得到收益 用0/卖出,1/买入标志是否真实进行了交易,记录次数 #include<bits/stdc++. ...
- The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)
传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...
- POJ 3253 Fence Repair 贪心 优先级队列
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 77001 Accepted: 25185 De ...
- POJ 2431 Expedition 贪心 优先级队列
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30702 Accepted: 8457 Descr ...
- 【POJ 3614 Sunscreen】贪心 优先级队列
题目链接:http://poj.org/problem?id=3614 题意:C头牛去晒太阳,每头牛有自己所限定的spf安全范围[min, max]:有L瓶防晒液,每瓶有自己的spf值和容量(能供几头 ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 hdu6438 Buy and Resell 买入卖出问题 贪心
Buy and Resell Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
随机推荐
- 原型模式 —— Java的赋值、浅克隆和深度克隆的区别
赋值 直接 = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...
- Codeforces Round #416 (Div. 2) A. Vladik and Courtesy【思维/模拟】
A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 前端框架中 “类mixin” 模式的思考
"类 mixin" 指的是 Vue 中的 mixin,Regular 中的 implement 使用 Mixin 的目的 首先我们需要知道为什么会有 mixin 的存在? 为了扩展 ...
- KiCad 元件值 F4NNIU 规范(2019-10-10)
目录 KiCad 元件值 F4NNIU 规范 电阻 电容 电感 二极管 三极管 MOSFET IC 文件历史 KiCad 元件值 F4NNIU 规范 为方便物料统计以及规范物料,在制造 BOM 时可以 ...
- 介绍(javascript调试)
Chrome developer tool Chrome浏览器得益于其优秀的V8解释器,javascript执行速度和内存占有率表现非常优秀.对于html+css+javascript前台技术的学习或 ...
- C++之ARX 读取配置文件内容时,会出现编码问题(utf-8转unicode)
CString CConvert::UTF82WCS(const char* szU8){ //预转换,得到所需空间的大小; int wcsLen = ::MultiByteToWideChar(CP ...
- iOS 9 新特性之实现 3D Touch
http://www.cocoachina.com/ios/20151027/13812.html 10月19号,周末,起床去吃早餐,吃完回来顺便去沃尔玛逛逛,把晚上的菜给买了,逛着逛着就来到了卖苹果 ...
- “获取access_token”接口新增IP白名单保护
- oracle-Immediate
从shutdown immediate命令发布起,禁止建立任何新的oracle连接 未提交的事务被回退.因此,处于一个事务中间的用户将失去所有未提交的劳动成果. oracle不等待客户断开连接.任何未 ...
- Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母
给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 数组里字母的顺序是循环的.举个例子,如果目标字母target = 'z' 并且有 ...