多少年不写题了...

(我把每一天看作是一个商品,第i天是第i个商品)

一开始看了半天看出来一个性质:买的所有商品中最贵的不会比卖的所有商品中最便宜的贵,然后似乎没有什么用处....

所以最后还是看题解了.

关键在于,从前x天的最优策略必然可以通过至多一次修改得到前(x+1)天的最优策略.

(所谓前x天的最优策略就是假设只有前x天,x天之后不再操作时的最优策略)

首先,第(x+1)天如果不进行操作,最优策略必然和前x天的时候一样.

如果进行操作,必然只能在第(x+1)天卖出,那就必须保证在第(x+1)天的时候手里剩下一个商品.

也就是说,我们现在要求一个方案,使得第x天结束的时候手里恰好有1个商品,在这个前提下赚到最多的钱(付出的钱最少).

由我们的前提,我们现在已经知道一个最优方案,可以在第x天结束的时候手里有0个商品了.假设这个最优方案买了y次卖了y次.那么我们要的x天后剩下一个商品的最优方案必然可以通过买y次卖y次的最优方案基础上少卖一次/多买一次之后得到(也就是说,考虑卖掉的商品中最便宜的z,以及前x个当中没买的商品中最便宜的w,不卖z或者买下w).

我们把买y个卖y个的最优方案记作S(y,y).修改一次之后得到的最优方案其实是这么得到的:按照价格从低到高考虑每一个商品,找到第一个没有被购买的商品Q(可能是出售,也可能是不操作),买下来.(其实是"不操作变成购买","出售变成不操作").比这个商品价格更低的商品一定都被购买了

那么接下来考虑S(y+1,y)/S(y,y-1)中的最优方案S2,假设不是S(y,y)修改一次之后得到的,看看会发生什么.

这个所谓的S2中,如果对Q执行的操作是购买或不操作,而且"少买一个Q/多卖一个Q"之后还是合法方案,那就把购买Q变成不操作,不操作变成出售Q,就能得到一个比S(y,y)还要好的方案.

证不出来了....先坑着...太菜了...

#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
int main(){
int T;scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int x;
priority_queue<int,vector<int>,greater<int> > bought,sold,tobuy;
int cnt=0;
ll ans=0;
for(int i=1;i<=n;++i){
scanf("%d",&x);
bool flag1=!tobuy.empty()&&x>tobuy.top();
bool flag2=!sold.empty()&&x>sold.top();
if(flag1&&(!flag2)){
int y=tobuy.top();tobuy.pop();
ans+=x-y;bought.push(y);sold.push(x);
cnt++;
}else if((!flag1)&&flag2){
int y=sold.top();sold.pop();
sold.push(x);tobuy.push(y);
ans+=x-y;
}else if(flag1&&flag2){
int dlt1=x-tobuy.top(),dlt2=x-sold.top();
if(dlt2>=dlt1){
int y=sold.top();sold.pop();
sold.push(x);tobuy.push(y);
ans+=x-y;
}else{
int y=tobuy.top();tobuy.pop();
ans+=x-y;bought.push(y);sold.push(x);
cnt++;
}
}
else tobuy.push(x);
}
printf("%lld %d\n",ans,cnt*2);
}
return 0;
}

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

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

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

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

  7. HDU6438:Buy and Resell(贪心+数据结构)

    题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少 分析:对每一个元素产生的贡献可以先计算 ...

  8. 2018 CCPC 网络赛 Buy and Resell

    The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed ...

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

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

随机推荐

  1. python的super函数学习

    一.为什么要用super? 在Python 2.2以前,通常的做法: class A: def __init__(self): print "enter A" print &quo ...

  2. ionic生成签名的APK方法总结

    ionic生成签名的apk步骤如下: 1. 在项目目录下运行 ionic build android --release 先生成一个未签名的apk 2. 在项目目录下运行 keytool -genke ...

  3. Python之pexpect详解

    一.引子 Pexpect程序主要用于人机对话的模拟,就是那种系统提问,人来回答yes/no,或者账号登陆输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第 ...

  4. 前端基础css

    CSS主要学习的是选择器和样式属性. 导入css的方式:行内样式,内部样式,外部样式(推荐使用) 行内样式:在标记的style属性中设定CSS样式 <p style="color: g ...

  5. skipfish介绍

    skipfish 开发语言:C语言 命令行扫描器 主动扫描web安全评估工具 谷歌开发 已经不再进行维护 重点关注web代码 通过两种方式进项扫描:1.字典枚举 2.递归爬网 优点:速度快.支持多路单 ...

  6. windows c++如何使窗口动态改变位置

    在windows软件中,经常会碰到一个功能:鼠标hover在某个地方时会出现窗口,有时候这个窗口的位置是会动态调整的. 熟悉使用windows API,理解windows中虚拟坐标.工作区坐标.屏幕坐 ...

  7. 图片人脸检测(OpenCV版)

    图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 功能展示 识别一种图上的所有人的脸,并且标出人脸的位置,画出人眼以及嘴的位置,展示效果图如下: 多 ...

  8. Vue 入门之概念

    Vue 简介 Vue 是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 [view].新的 Vue 版本参考了 React 的部分设计,当然也有自己独特的地方,比如 Vue 的单文件组 ...

  9. CentOs6.5中安装和配置vsftp简明教程[转]

    CentOs6.5中安装和配置vsftp简明教程 林涛 发表于:2017-3-17 10:10 分类:WebServer 标签: 101次 一.vsftp安装篇 复制代码代码如下: # 安装vsftp ...

  10. LeetCode 566. Reshape the Matrix (C++)

    题目: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a n ...