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

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:Portal传送门

 Portal传送门
 原题目描述在最下面。
 出过很多次:51nodNOIP提高组贪心专题A,牛客寒假多校(不记得那场了),CodeforcesContest865D。
 低买高卖问题。 n ( 1 e 5 ) n(1e5) n(1e5)天共 n n n种利率,你每天只能买入或卖出一件商品或者啥都不干,你买得起所有商品,问你最多盈利多少?


 ps:FZU2281 Trades是可以买入卖出许多件物品.

Solution:

 首先对于当前价格B而言,只要前面有比这个价格低的价格A,那么当前情况A买入B卖出一定盈利。
 但是A买入B卖出不一定是最优解,所以为了有后悔药吃,就再push两个B进入优先队列,一个表示卖出,一个表示买入。
 每天都卖出,每次累加差值就可以了。累加很多个差分值肯定会得到最优解的。
 因为A买入B卖出B买入C卖出 和 A买入C卖出 效果一样


 活捉一个分治+dp的大佬:here

AC_Code:
#include<bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
 
int main() {
  int tim;
  int n;
  scanf("%d", &tim);
  while(tim--){
  scanf("%d",&n);
    priority_queue<pair<int,int>>q;
    LL ans = 0;
    int tot = 0;
    for(int i = 0, x; i < n; ++i){
      scanf("%d", &x);
      q.push(make_pair(-x, 1));//买入
      q.push(make_pair(-x, 2));//卖出
      LL tmp = x + q.top().first;//卖出x并选择之前最便宜的一个买入
      if(q.top().second == 1) tot += 2;//对于实际交易,卖出和买入肯定是对应的
      ans += tmp; q.pop(); 
    }
    printf("%lld %d\n", ans, tot);
  }
  return 0;
}

Problem Description:

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值