2018中国大学生程序设计竞赛 - 网络选拔赛--HDU 6438 Buy and Resell(贪心)

题意:

有 n 个城市,每个城市可以买一个价值为 ai 的东西或者卖一个价值为 ai 的东西,假设你一开始有无数的钱,问你经过这些城市最多可以赚多少利润。

题解:

有利润就要当前的值大于你买进去的值,比如第一个样例:(10-2,9-1) 和 (10-1,9-2)是一样的。

如果我们只是这样去求答案是不对的,因为在第一个样例中 2 是大于 1的,这样就很亏,但是我们可以发现先 2-1 再10-2 和10-1 是一样的,所以我们维护一个优先队列去保存从小到大(用过优先),答案就是差值。

#include <algorithm>
#include  <iostream>
#include   <cstdlib>
#include   <cstring>
#include    <cstdio>
#include    <string>
#include    <vector>
#include    <bitset>
#include     <stack>
#include     <cmath>
#include     <deque>
#include     <queue>
#include      <list>
#include       <set>
#include       <map>
#define mem(a, b) memset(a, b, sizeof(a))
#define inf 0x7ffffff
#define pi acos(-1)
using namespace std;
typedef long long ll;

struct node{
    ll num, mark;
    node(){};
    node(ll _num, ll _mark){
        num = _num;
        mark = _mark;
    }
    friend bool operator < (node a, node b){
        if(a.num == b.num){
            return a.mark < b.mark;
        }
        return a.num > b.num;
    }
}; 

priority_queue<node> q;

int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        ll n, ans = 0, cnt = 0;
        scanf("%lld", &n);
        for(int i = 0; i < n; i++){
            ll a;
            scanf("%lld", &a);
            node temp, now = node(a, 0);
            q.push(now);
            temp = q.top();
            if(a > temp.num){
                ans += a - temp.num;
                q.pop();
                q.push(node(a, 1));
            }
        }
        while(!q.empty()){
            node temp = q.top();
            q.pop();
            if(temp.mark){
                cnt++;
            }
        }
        printf("%lld %lld\n", ans, cnt*2);
    }
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章