有一个物品每天的价格不同,每天可以选择以当天的价格买入或卖出问n天后最多挣多少钱以及最少的交易次数
做法是把每天的价格丢到队列里,如果当天的价格高于队列top就把top弹出,更新总收益,并把当天价格push两次,这里push两次目的是当天的价格可能不是最优比如1 2 10 11第二天卖出同时push两次进去,第三天卖出,第四天又卖出,相当于第二天作为跳板,同时又把第二天买入又卖出了。
处理交易次数也是一个问题,可以在队里的再多加一个属性记录这个节点是否是跳板
#include <bits/stdc++.h>
using namespace std;
const int mx = 1e5+5;
struct node{
int val, type;
bool operator <(const node b) const{
if (val != b.val) return val > b.val;
return type > b.type;
}
};
priority_queue <node> Q;
int main() {
//freopen("1.in", "r", stdin);
//freopen("1.out", "w+", stdout);
int T;
scanf("%d", &T);
while(T--) {
while (!Q.empty()) Q.pop();
int n, sum = 0;
long long ans = 0;
node tmp;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int val;
scanf("%d", &val);
tmp.val = val;
tmp.type = 2;
if (!Q.empty() && val > Q.top().val) {
//printf("val = %d Q.top().val = %d type = %d\n", val, Q.top().val, Q.top().type);
ans += val - Q.top().val;
sum += Q.top().type;
tmp.type = 0;
Q.pop(); Q.push(tmp);
tmp.type = 2; Q.push(tmp);
}
else Q.push(tmp);
}
printf("%lld %d\n", ans, sum);
}
return 0;
}