Buy and ResellTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1784 Accepted Submission(s): 630 Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed to trade it. The trading price of the Power Cube in the i -th city is ai dollars per cube. Noswal is a foxy businessman and wants to quietly make a fortune by buying and reselling Power Cubes. To avoid being discovered by the police, Noswal will go to the i -th city and choose exactly one of the following three options on the i -th day:
Input There are multiple test cases. The first line of input contains a positive integer T (T≤250 ), indicating the number of test cases. For each test case:
Output For each case, print one line with two integers —— the maximum profit and the minimum times of trading to get the maximum profit.
Sample Input 3 4 1 2 10 9 5 9 5 9 10 5 2 2 1
Sample Output 16 4 5 2 0 0 Hint In the first case, he will buy in 1, 2 and resell in 3, 4. profit = - 1 - 2 + 10 + 9 = 16 In the second case, he will buy in 2 and resell in 4. profit = - 5 + 10 = 5 In the third case, he will do nothing and earn nothing. profit = 0
Source
|
参照:
https://blog.csdn.net/qq_39599067/article/details/82056382
https://blog.csdn.net/CURRYWANG97/article/details/82055044
#include<bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
struct forma
{
int first,second;
friend bool operator < (forma a,forma b){
if(a.first!=b.first)
return a.first<b.first; //从小到大,第一个top为最小值
else
return a.second<b.second;
}
};
int main() {
int tim;
int n;
scanf("%d", &tim);
while(tim--){
scanf("%d",&n);
priority_queue<forma >q;
LL ans = 0;
int tot = 0;
for(int i = 0, x; i < n; ++i){
scanf("%d",&x);
q.push((forma){-x,1});//买入
q.push((forma){-x,2});//卖出
LL tmp=x+q.top().first;
if(q.top().second == 1)tot+=2;//对于实际交易,买入一次必对应一次卖出
ans += tmp;
q.pop();
}
printf("%lld %d\n",ans,tot);
}
return 0;
}