题意:
有 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);
}
}