传送门

•参考资料

  [1]:HDU6438(优先队列+思维)

•题意

  有n个城市,第 i 天你会达到第 i 个城市;

  在第 i 个城市中,你可以用 ai 元购买一个物品,或者用 a元卖掉一个物品,你可以同时保存多个物品。

  最开始你身上没有物品,但是有无限的金钱;

  让你求从城市 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"(贪心+优先级队列)的更多相关文章

  1. HDU 6709“Fishing Master”(贪心+优先级队列)

    传送门 •参考资料 [1]:2019CCPC网络选拔赛 H.Fishing Master(思维+贪心) •题意 池塘里有 n 条鱼,捕捉一条鱼需要花费固定的 k 时间: 你有一个锅,每次只能煮一条鱼, ...

  2. HDU 6438 Buy and Resell ( 2018 CCPC 网络赛 && 贪心 )

    题目链接 题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少? 分析 : 和 CF 867 ...

  3. HDU 6438 Buy and Resell

    高卖低买,可以交易多次 维护一个优先队列,贪心 相当于每天卖出 用当前元素减优先队列最小得到收益 用0/卖出,1/买入标志是否真实进行了交易,记录次数 #include<bits/stdc++. ...

  4. The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)

    传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...

  5. POJ 3253 Fence Repair 贪心 优先级队列

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77001   Accepted: 25185 De ...

  6. POJ 2431 Expedition 贪心 优先级队列

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30702   Accepted: 8457 Descr ...

  7. 【POJ 3614 Sunscreen】贪心 优先级队列

    题目链接:http://poj.org/problem?id=3614 题意:C头牛去晒太阳,每头牛有自己所限定的spf安全范围[min, max]:有L瓶防晒液,每瓶有自己的spf值和容量(能供几头 ...

  8. 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...

  9. 2018中国大学生程序设计竞赛 - 网络选拔赛 hdu6438 Buy and Resell 买入卖出问题 贪心

    Buy and Resell Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

随机推荐

  1. 原型模式 —— Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

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

  3. 前端框架中 “类mixin” 模式的思考

    "类 mixin" 指的是 Vue 中的 mixin,Regular 中的 implement 使用 Mixin 的目的 首先我们需要知道为什么会有 mixin 的存在? 为了扩展 ...

  4. KiCad 元件值 F4NNIU 规范(2019-10-10)

    目录 KiCad 元件值 F4NNIU 规范 电阻 电容 电感 二极管 三极管 MOSFET IC 文件历史 KiCad 元件值 F4NNIU 规范 为方便物料统计以及规范物料,在制造 BOM 时可以 ...

  5. 介绍(javascript调试)

    Chrome developer tool Chrome浏览器得益于其优秀的V8解释器,javascript执行速度和内存占有率表现非常优秀.对于html+css+javascript前台技术的学习或 ...

  6. C++之ARX 读取配置文件内容时,会出现编码问题(utf-8转unicode)

    CString CConvert::UTF82WCS(const char* szU8){ //预转换,得到所需空间的大小; int wcsLen = ::MultiByteToWideChar(CP ...

  7. iOS 9 新特性之实现 3D Touch

    http://www.cocoachina.com/ios/20151027/13812.html 10月19号,周末,起床去吃早餐,吃完回来顺便去沃尔玛逛逛,把晚上的菜给买了,逛着逛着就来到了卖苹果 ...

  8. “获取access_token”接口新增IP白名单保护

  9. oracle-Immediate

    从shutdown immediate命令发布起,禁止建立任何新的oracle连接 未提交的事务被回退.因此,处于一个事务中间的用户将失去所有未提交的劳动成果. oracle不等待客户断开连接.任何未 ...

  10. Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母

    给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 数组里字母的顺序是循环的.举个例子,如果目标字母target = 'z' 并且有 ...