zoukankan      html  css  js  c++  java
  • CF865D Buy Low Sell High

    传送门

    感觉自己真的蠢
    这题用堆来做
    对于每个数都考虑当前时间点强制卖出,所以每次选择堆中最小的去统计答案
    这样不一定最优,所以考虑将除了第一个点外的其他点加两次
    这样统计答案时,如果堆中找到的是当前点,那么直接去掉,不产生贡献,说明当前点只能买入
    否则找到其他点,就视作在当前点卖出,无脑在当前点卖出当然不一定优,但是下次踢掉当前点时,可以视作当前点的卖出操作被撤销了
    这样的话第二次踢出一个点才视为在这个点买入,在当前点卖出
    现在说明为什么第一个点只加(1)次:
    因为第一个点没办法卖出,所以省略了一次插入
    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    void read(int &x) {
    	char ch; bool ok;
    	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
    }
    #define rg register
    const int maxn=3e5+10;
    int n;long long ans;
    priority_queue<int>q;
    int main()
    {
    	read(n);int g;read(g);q.push(-g);
    	for(rg int i=2,x;i<=n;i++)
    	{
    		read(x);
    		q.push(-x),q.push(-x);
    		ans+=x+q.top();q.pop();
    	}
    	printf("%lld
    ",ans);
    }
    
  • 相关阅读:
    MySQL 优化实施方案
    MySQL Replication 主从复制全方位解决方案
    CentOS 7.X 系统安装及优化
    W25Q32的使用
    Word分栏
    转载:STM32之中断与事件---中断与事件的区别
    常见贴片电阻的分类、功率、封装、标注规则
    导线时延
    重装系统流程
    MFC应用程序向导生成的文件
  • 原文地址:https://www.cnblogs.com/lcxer/p/10638936.html
Copyright © 2011-2022 走看看