Buy and ResellTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 945 Accepted Submission(s): 278 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 |
題意:
很經典的買賣問題,可以賣可以買可以不做什麼,帶的東西無上限初始金錢無上限。問最大收益。
做法:
優先隊列按價格排序,有大神版本和小菜鳥版本,都留一下。
大神版本。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
int main(){
int t,n;
cin>>t;
while(t--){
scanf("%d",&n);
priority_queue<pair<int,int> > q;
ll ans=0,tot=0,tmp;
for(int i=0,x;i<n;++i){
scanf("%d",&x);
//if(!q.empty()) cout<<q.top().first<<" "<<q.top().second<<endl;
q.push({-x,1});//買入
q.push({-x,2});//賣出
tmp=x+q.top().first;
if(q.top().second==1)tot+=2;
ans+=tmp; q.pop();
}
printf("%lld %d\n",ans,tot);
}
return 0;
}
小菜雞版本:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=100005;
struct node{
int sell,resell;
bool operator < (const node &a) const{
return resell>a.resell;
}
}temp,now;
int main(){
int t,n;
ll ans,cnt;
cin>>t;
while(t--){
priority_queue<node> tmp,tru;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int aim1=0,aim2=0,x;
scanf("%d",&x);
if(tmp.empty()==0)
aim1=x-tmp.top().resell;
if(tru.empty()==0)
aim2=x-tru.top().resell;
if(aim1<=0&&aim2<=0){
now.resell=x;
tmp.push(now);
}
else if(aim2>=aim1){
now=tru.top(); tru.pop();
temp=now; now.resell=x;
tru.push(now); tmp.push(temp);
}
else{
now=tmp.top(); tmp.pop();
now.sell=now.resell;
now.resell=x;
tru.push(now);
}
}
ans=cnt=0;
while(!tru.empty()){
ans+=tru.top().resell-tru.top().sell;
cnt+=2;tru.pop();
}
printf("%lld %lld\n",ans,cnt);
}
return 0;
}