zoukankan      html  css  js  c++  java
  • HDU 6438 Buy and Resell ( 2018 CCPC 网络赛 && 贪心 )

    题目链接

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

    分析 :

    和 CF 867E 一模一样 传送门

    可以去搜这题的题解、有很多

    对于每个元素产生的贡献

    可以先算出暂时的最优值

    如果下次碰到更优的选择再进行替换

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

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

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

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

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

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

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

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

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

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

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

    可以自己拿着 AC 代码过过样例就懂了

    这样子操作直到枚举完所有元素

    总的说就是暂时确定最优值、之后有更优再替换的贪心方法

    #include<bits/stdc++.h>
    #define LL long long
    #define ULL unsigned long long
    
    #define scl(i) scanf("%lld", &i)
    #define scll(i, j) scanf("%lld %lld", &i, &j)
    #define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
    #define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)
    
    #define scs(i) scanf("%s", i)
    #define sci(i) scanf("%d", &i)
    #define scd(i) scanf("%lf", &i)
    #define scIl(i) scanf("%I64d", &i)
    #define scii(i, j) scanf("%d %d", &i, &j)
    #define scdd(i, j) scanf("%lf %lf", &i, &j)
    #define scIll(i, j) scanf("%I64d %I64d", &i, &j)
    #define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
    #define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
    #define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
    #define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)
    #define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)
    #define scIllll(i, j, k, l) scanf("%I64d %I64d %I64d %I64d", &i, &j, &k, &l)
    
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define lowbit(i) (i & (-i))
    #define mem(i, j) memset(i, j, sizeof(i))
    
    #define fir first
    #define sec second
    #define VI vector<int>
    #define ins(i) insert(i)
    #define pb(i) push_back(i)
    #define pii pair<int, int>
    #define VL vector<long long>
    #define mk(i, j) make_pair(i, j)
    #define all(i) i.begin(), i.end()
    #define pll pair<long long, long long>
    
    #define _TIME 0
    #define _INPUT 0
    #define _OUTPUT 0
    clock_t START, END;
    void __stTIME();
    void __enTIME();
    void __IOPUT();
    using namespace std;
    
    int main(void){__stTIME();__IOPUT();
    
    
        int nCase;
        sci(nCase);
    
        while(nCase--){
            int n;
            sci(n);
    
            priority_queue<pll, vector<pll>, greater<pll> > que;
    
            LL ans = 0;
            int num = 0;
            for(int i=0; i<n; i++){
                LL val;
                scl(val);
                if(!que.empty() && que.top().fir < val){
                    num++;
                    pll T = que.top(); que.pop();
                    if(T.sec == 1) num--;
                    else num++;
                    ans += val - T.fir;
                    que.push(mk(val, 1));
                    que.push(mk(val, 2));
                }else que.push(mk(val, 3));
            }
    
            printf("%lld %d
    ", ans, num);
        }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    __enTIME();return 0;}
    
    
    void __stTIME()
    {
        #if _TIME
            START = clock();
        #endif
    }
    
    void __enTIME()
    {
        #if _TIME
            END = clock();
            cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
        #endif
    }
    
    void __IOPUT()
    {
        #if _INPUT
            freopen("in.txt", "r", stdin);
        #endif
        #if _OUTPUT
            freopen("out.txt", "w", stdout);
        #endif
    }
    View Code
  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/9535919.html
Copyright © 2011-2022 走看看