hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
題目傳送門
題目描述:
有n座城市,每座城市都可以對一個物品進行一次的買進或者賣出,可以同時擁有多個物品,計算利潤最大值,并且交易次數(shù)要最少。(買入賣出算兩次操作)
思路:
建立兩個小根堆 優(yōu)先隊列,q1放可以買的物品,q2放可以賣的物品。
如果兩個隊列都是空的,則把這個物品放入q1.
如果q1是有的,而q2是空的,則把a[i]和q1的頂比一下,如果比他大,則q1 pop一次,把a[i]塞入q2,并且把差值累計到ans上。
如果q1無,q2有,則拿a[i]和q2頂比一下,如果比它大,則把q2頂元素放入q1,a[i]放入q2,差值累積到ans上。
如果兩個都有,如果a[i]和兩個隊列頂部元素差值相同,則優(yōu)先替換q2的,計算差值,a[i]放入q2,原來的q2頂放入q1.這樣可以保證交易天數(shù)最小。 如果不相等,則替換放入大的那個,元素也要放到應(yīng)該放的隊列里,如果不能替換,就放入第一個。
這樣做是因為我們只關(guān)心一個物品賣出后的利潤,所以買入的價格不重要,重要的是賣出后的價格,因為這個是可以被替換的,而相同情況下,要減少天數(shù),所以先替換已經(jīng)賣出的東西。
感謝薛佬教我!
#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网络赛 贪心的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全温振荡器在实验室中的应用指南
- 下一篇: 《Web接口开发与自动化测试》学习笔记(