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

分析:对每一个元素产生的贡献可以先计算出暂时的最优值,注意是暂时的最优,应为后面可以出现更加优的答案,所有下次遇到更优的时候就进行替换;

具体就是首先使用小顶堆维护枚举过的元素

然后对于当前枚举到的元素

用它和堆顶元素做对比、如果小于或等于堆顶元素

那么它无法和之前枚举过的所有元素的任何一个做减法产生贡献

所以将其加入这个小顶堆当中去

如果大于堆顶元素、则用它和堆顶元素做减法、算出它和堆顶元素产生贡献

当然这个贡献只是暂时最优的、堆顶元素和当前枚举到的元素进行配对并不一定是最优的

那么怎么样在下一次枚举到更优的配对元素时进行替换

答案就是做完贡献之后、将堆顶元素弹出、然后 push 两次当前枚举到的元素进入堆内

第一个 push 的意义是下次如果其作为堆顶元素、那么可以把它拿出来做减法达到反悔操作

第二个 push 的意义就是真正的卖出

每天都卖出,每次累加差值就可以了。累加很多个差分值肯定会得到最优解的。
 因为A买入B卖出B买入C卖出 和 A买入C卖出 效果一样的

#include<bits/stdc++.h>
using namespace std;
#define pll pair<long long , long long >
#define ll long long
int main( )
{
int t ;
scanf("%d",&t);
while(t--)
{
int n ;
scanf("%d",&n);
priority_queue<pll , vector<pll> , greater<pll> > qu ;
ll ans = ;
int num = ;
for(int i= ; i<n ; i++)
{
ll val;
scanf("%lld",&val);
if(!qu.empty() && qu.top().first < val)
{ num++;
pll T=qu.top() ; qu.pop();
if(T.second == )
num--;
else
num++;
ans+=val-T.first;
printf("(%lld %d %d)\n", ans,num,val);
qu.push(make_pair(val,));
qu.push(make_pair(val,));
}
else
qu.push(make_pair(val,));
}
printf("%lld %d\n",ans , num);
} }

HDU6438:Buy and Resell(贪心+数据结构)的更多相关文章

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

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

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

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

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

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

  4. HDU6438 Buy and Resell 2018CCPC网络赛 -低买高卖-贪心经典题

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  出过很多次:5 ...

  5. hdu6438 Buy and Resell

    多少年不写题了... (我把每一天看作是一个商品,第i天是第i个商品) 一开始看了半天看出来一个性质:买的所有商品中最贵的不会比卖的所有商品中最便宜的贵,然后似乎没有什么用处.... 所以最后还是看题 ...

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

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

  7. hdu3438 Buy and Resell(优先队列+贪心)

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

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

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

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

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

随机推荐

  1. css--offsetParent

    offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素. 如果这个容器元素未进行CSS定位, ...

  2. Log4Net日志记录介绍

    原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...

  3. Boost库之asio io_service以及run、run_one、poll、poll_one区别

    一.io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数.Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,r ...

  4. puppet前端管理工具foreman-proxy bind 127.0.0.1:8443问题解决

    最近在玩foreman,发现部署foreman-proxy的时候,总是出现8443bind在127.0.0.1端口,导致无法访问的情况. 如下图: 经过strace -o log.txt bin/sm ...

  5. 如何将OpenTSDB源码导入eclipse

    OpenTSDB的官网上介绍了如何将OpenTSDB源码导入eclipse,官方链接,但步骤超级繁琐,还有一个简便方法,下面以导入OpenTSDB2.0.0为例. 1. 下载OpenTSDB2.0.0 ...

  6. ES6学习之Set和Map

    一.Set 1.Set 定义:Set类似于数组,但成员的值都是唯一的,没有重复的值 let s = new Set([1,2,3,4,5,2,4]); //Set { 1, 2, 3, 4, 5 } ...

  7. 将List中部分字段转换为DataTable中

    由于原来方法导出数据量比较大 的时候,出现卡顿现象:搜索简单改造:(下面方法借助NPIO) /// <summary> /// 将List中原文和译文转换为Datatable /// &l ...

  8. [转]VS 2013 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService...匹配的导出

    前几天,将Visual studio 2013 update 3 升级到了update 5.打开原来的解决方案,出现了 未找到与约束 contractname Microsoft.VisualStud ...

  9. cisco 2901 配置拨号上网

    1.输入en,然后输入密码确认后按conf t2.Router(config)# vpdn enable        interface dialer 1   // 进入拨号器13.Router(c ...

  10. 10个C语言经典

    1.计算Fibonacci数列Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.C语言实现的代码如下: /* t3ing Fibonac ...