hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
題目傳送門(mén)
題目描述:
有n座城市,每座城市都可以對(duì)一個(gè)物品進(jìn)行一次的買(mǎi)進(jìn)或者賣(mài)出,可以同時(shí)擁有多個(gè)物品,計(jì)算利潤(rùn)最大值,并且交易次數(shù)要最少。(買(mǎi)入賣(mài)出算兩次操作)
思路:
建立兩個(gè)小根堆 優(yōu)先隊(duì)列,q1放可以買(mǎi)的物品,q2放可以賣(mài)的物品。
如果兩個(gè)隊(duì)列都是空的,則把這個(gè)物品放入q1.
如果q1是有的,而q2是空的,則把a(bǔ)[i]和q1的頂比一下,如果比他大,則q1 pop一次,把a(bǔ)[i]塞入q2,并且把差值累計(jì)到ans上。
如果q1無(wú),q2有,則拿a[i]和q2頂比一下,如果比它大,則把q2頂元素放入q1,a[i]放入q2,差值累積到ans上。
如果兩個(gè)都有,如果a[i]和兩個(gè)隊(duì)列頂部元素差值相同,則優(yōu)先替換q2的,計(jì)算差值,a[i]放入q2,原來(lái)的q2頂放入q1.這樣可以保證交易天數(shù)最小。 如果不相等,則替換放入大的那個(gè),元素也要放到應(yīng)該放的隊(duì)列里,如果不能替換,就放入第一個(gè)。
這樣做是因?yàn)槲覀冎魂P(guān)心一個(gè)物品賣(mài)出后的利潤(rùn),所以買(mǎi)入的價(jià)格不重要,重要的是賣(mài)出后的價(jià)格,因?yàn)檫@個(gè)是可以被替換的,而相同情況下,要減少天數(shù),所以先替換已經(jīng)賣(mài)出的東西。
感謝薛佬教我!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string.h>
#include<sstream>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int rd(void) {
int x=0;
int f=1;
char s=getchar();
while(s<'0'||s>'9') {
if(s=='-')f=-1;
s=getchar();
}
while(s>='0'&&s<='9') {
x=x*10+s-'0';
s=getchar();
}
x*=f;
return x;
}
priority_queue<ll,vector<ll> ,greater<ll> >q1;
priority_queue<ll,vector<ll> ,greater<ll> >q2;
int n;
const int maxn=100010;
ll a[maxn];
int main() {
int T;
cin>>T;
while(T--) {
while(!q1.empty())q1.pop();
while(!q2.empty())q2.pop();
scanf("%d",&n);
ll sum=0;
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
if(q2.empty()) {
if(q1.empty()) {
q1.push(a[i]);
} else {
ll temp=q1.top();
if(a[i]>temp) {
sum+=a[i]-temp;
q1.pop();
q2.push(a[i]);
} else {
q1.push(a[i]);
}
}
} else {
if(!q1.empty()) {
ll temp1=q1.top();
ll temp2=q2.top();
if(a[i]>temp2&&temp1>=temp2) {
q1.push(temp2);
q2.pop();
q2.push(a[i]);
sum+=a[i]-temp2;
} else if(a[i]>temp1) {
q1.pop();
sum+=a[i]-temp1;
q2.push(a[i]);
} else {
q1.push(a[i]);
}
} else {
ll temp=q2.top();
if(a[i]>temp) {
sum+=a[i]-temp;
q2.pop();
q1.push(temp);
q2.push(a[i]);
} else
q1.push(a[i]);
}
}
}
printf("%lld %d\n",sum,q2.size()*2);
}
}
Buy and Resell
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 722 Accepted Submission(s): 188
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:
1. spend ai dollars to buy a Power Cube
2. resell a Power Cube and get ai dollars if he has at least one Power Cube
3. do nothing
Obviously, Noswal can own more than one Power Cubes at the same time. After going to the n cities, he will go back home and stay away from the cops. He wants to know the maximum profit he can earn. In the meanwhile, to lower the risks, he wants to minimize the times of trading (include buy and sell) to get the maximum profit. Noswal is a foxy and successful businessman so you can assume that he has infinity money at the beginning.
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:
The first line has an integer n. (1≤n≤105)
The second line has n integers a1,a2,…,an where ai means the trading price (buy or sell) of the Power Cube in the i-th city. (1≤ai≤109)
It is guaranteed that the sum of all n is no more than 5×105.
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
總結(jié)
以上是生活随笔為你收集整理的hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全温振荡器在实验室中的应用指南
- 下一篇: 氙灯耐侯试验箱的这些注意事项你都知道吗?