首页 > 其他分享 >CF865D Buy Low Sell High

CF865D Buy Low Sell High

时间:2024-08-27 09:15:21浏览次数:3  
标签:Sell Buy const CF865D ll Low define

CF865D Buy Low Sell High

Buy Low Sell High

题目
已知接下来N天的股票价格,每天你可以买进一股股票,卖出一股股票,或者什么也不做.N天之后你拥有的股票应为0,当然,希望这N天内能够赚足够多的钱.

分析

  • 假如我们当前这个\(a_j\)作为某天卖出,那么一定是和前面的还没有用的最小的\(a_i\)来进行配对,并且只有当\(a_j>a_i\) 时才进行配对,且得到利润为\(a_j-a_i\),因此我们可以用一个堆记录哪些还没有用
  • 但是我们在这一天卖出不一定是最优的
  • 假象我们在这一天同时又买入了一个价值为val的股票,并在之后第k天卖出
  • 如果有\(a_j-a_i+a_k-val=a_k-a_i\)也就是\(val=a_j\)的时候我们相当于撤销了在第j天卖出,转而在第k天卖出
  • 另外为什么当前最小的\(a_i\)一定出现在最后的配对里呢?
  • 假设最终答案中不包含\(-a_i\)这一项
  • 假如也不包含\(a_j(i<j)\)这一项,那么我们可以让它们配对,与当前答案是最右答案矛盾
  • 因为\(a_i\)是\(a_j\)选择时最小的一项,所以它一定会跟\(a_i\)配对
  • 如果是出现了像\(a_k-a_j\)这样的项,我们直接替换为\(a_k-a_i\)答案只会变大,与答案的最优性矛盾
#include<bits/stdc++.h>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define eb emplace_back
#define mk(x,y) make_pair((x),(y))
#define A puts("YES")
#define B puts("NO")
#define lc (o<<1)
#define rc ((o<<1)|1)
#define pi pair<ll,ll>
using namespace std;
typedef long long ll;
typedef double db;
const int N=5005;
const ll P=131;
const ll Q=13331;
const ll inf=1ll<<60;
const ll mo1=1e9+7;
const ll mo2=1e9+9;
const ll mo=998244353;
ll n,x,ans;
priority_queue<ll, vector<ll>, greater<ll>> q;
int main(){
//	freopen("data.in","r",stdin);

	scanf("%lld",&n);
	fo(i,1,n) {
		scanf("%lld",&x);
		if (!q.empty() && x>q.top()) {
			ans+=x-q.top();
			q.pop();
			q.push(x);
		}
		q.push(x);
	}
	printf("%lld",ans);


	return 0;
}
 

标签:Sell,Buy,const,CF865D,ll,Low,define
From: https://www.cnblogs.com/ganking/p/18381972

相关文章

  • 题解:P10688 Buy Tickets
    题目大意排队时有人插队。输入格式给定队列长度$n$。接下来$n$行每行两个正整数,第一个表示该元素插入位置,另一个表示该元素的权值。输出格式按照顺序输出该位置元素的权值。注意事项输入的数据组数未知,需要一直输入,输入方法可以参考以下代码。while(cin>>n){......
  • Walmart之获取订单(SellerFulfilled、WFSFulfilled)
    API地址CA:https://developer.walmart.com/api/ca/mp/orders#operation/getAllOrdersUS:https://developer.walmart.com/api/us/mp/orders#operation/getAllOrders一、建立请求实体与响应实体类(CA和US站点相差不大)请求实体@DatapublicclassWmGetOrderRequest{/......
  • P4544 [USACO10NOV] Buying Feed G
    思路:考虑动态规划算法。定义\(dp_{i,j}\)表示达到第\(i\)家商店时共买了\(j\)吨饲料的最小花费,那么我们可以枚举到达上一家店的饲料数\(k\):\[dp_{i,j}=(x_i-x_{i-1})\timesj^2+\min\limits_{k=j-f_{i-1}}^jdp_{i-1,k}+c_{i-1}\times(j-k)\]可以将和\(i-1\)......
  • Robin-Stocks Python 中的 order_buy_fractional_by_price 问题
    我在Robin-StocksPython包中的order_buy_fractional_by_price函数中遇到问题。在正常市场交易时间内下达以美元为基础的买入订单时,该订单被错误地设置为限价订单。对我来说看起来有问题的代码似乎是导致此问题的原因。我尝试在包管理器中本地修改或删除有问题的代码,但遇......
  • [极客大挑战 2019]BuyFlag
    [极客大挑战2019]BuyFlag源代码的提示<!-- ~~~postmoneyandpassword~~~if(isset($_POST['password'])){ $password=$_POST['password']; if(is_numeric($password)){ echo"passwordcan'tbenumber</br>"; }elseif($p......
  • D. Buying Jewels
    原题链接题解构造题,先想特殊情况再验证构造一个\(n-k+1,1\)不成立的条件是\(2*(n-k+1)\leqn\),相当于\(2k\geqn+2\),即k大于n的一半,能构造的第一多的k是n,第二多是\(n/2+1\),易得不成立code#include<bits/stdc++.h>#definelllonglongusingnamespacestd......
  • buying a SIM card and registering a mobile phone number
    Here’sasampleconversationaboutbuyingaSIMcardandregisteringamobilephonenumber:User:Hi,IneedtobuyaSIMcardandregisteramobilephonenumber.Canyouguidemethroughtheprocess?Salesperson:Ofcourse!First,weneedtochooseamo......
  • SP4063 MPIGS - Sell Pigs / P4638 [SHOI2011] 银行家题解
    考虑使用网络流。建立源点\(S\)和汇点\(T\)。每个人作为一个点,将它们与汇点\(T\)连接,权值为需要的猪的数量。然后对于每个人,如果和之前的某个人开了相同的猪圈,那么就将之前的那个人的点与这个人的点连接。如果猪圈还没有被开过,就从源点\(S\)连接这个点,权值为猪圈猪的初......
  • 性价比很高的多域名SSL证书:Buypass
    在当今数字化快速发展的时代,网络安全已成为公众和企业关注的焦点。为了保障网站数据的安全传输,许多网站都采用了SSL证书来加密用户与服务器之间的通信。申请Buypass六个月免费SSL证书步骤1、输入域名,注意由于Buypass不支持泛域名,请不要勾选泛域名。 2、选择加密方式,一般选......
  • 使用乐观锁和CAS解决超卖(Overselling)
    今天我要和大家分享的是如何在Java中使用乐观锁和CAS(Compare-And-Swap)技术来解决超卖的问题。最近我在项目中实现了这个功能,觉得非常有意思,所以决定分享出来。希望对大家有所帮助!背景介绍秒杀活动通常在电商平台中很常见,我觉得实现这个功能的难点在于多线程避免超卖。为了应......