http://acm.hdu.edu.cn/showproblem.php?pid=6438
题意:
有n个城市,你可以在一个城市买一个东西,也可以卖一个东西,也可以不买不卖,然后问获得的最大利润和最小操作数。
思路:
这个博主的文章写的很详细
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
const int inf=0x7fffffff;
ll a[maxn];
priority_queue<ll, vector<ll>, greater<ll> > q;
map<ll,int>mp;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
while(!q.empty())q.pop();
int n;
mp.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
int cnt=0;
ll ans=0;
for(int i=1;i<=n;i++)
{
if(!q.empty()&&q.top()<a[i])
{
ll x=q.top();
q.pop();
ans+=a[i]-x;
cnt++;
if(mp[x]){mp[x]--,cnt--;}
q.push(a[i]);
mp[a[i]]++;
}
q.push(a[i]);
}
printf("%lld %d\n",ans,cnt*2);
}
}