网选赛做的和*一样...我背锅.
题意:输入n个数.代表某商人一次经过地方的某物品价格.商人一次只能在某个地方买或者卖一台或者不买不卖.求获得的最大利益.
我蠢到存下所有价格然后每次找最大最小价格看顺序买卖.woc想起来我就是一sb啊.........
瞎写个思路吧:首先想从短到长的结果。如果某个例子多加一个数,就找之前所有数中最小的那个然后看看卖了是否赚钱就好.如果卖掉的是之前买入的就可以减少次数!!
那我们用vis数组维护某个数被使用次数.用小顶堆维护输入的数,每输入一个数就看堆顶是否小于这个数,if.不小于,当前输入的数进堆里. else 小于,vis输入的数+1,取出堆顶的数
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define xh(i,m,n) for(int i=m;i<=n;i++)
#define ll long long
#define se(w) scanf("%lf",&w)
#define ss(o) scanf("%s",o)
#define sd(q) scanf("%d",&q)
#define init(qwe) memset(qwe,0,sizeof(qwe));
#define finit(qwe) memset(qwe,-1,sizeof(qwe));
#define INF 0x3f3f3f3f
#define maxn 500005
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define MAXN 100005
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define gc getchar()
using namespace std;
map<int ,int >vis;
priority_queue <int,vector<int>,greater<int> >que;
int main()
{
int k,num,c;sd(k);ll ans,anss;
xh(cas,1,k)
{vis.clear();while(!que.empty())que.pop();
sd(num);ans=anss=0;
while(num--)
{
sd(c);
if(que.empty()||que.top()>=c)que.push(c);
else{
anss++;
int fok=que.top();que.pop();
ans+=(c-fok);
if(vis[fok]>0){anss--;vis[fok]--;}
que.push(c);que.push(c);
vis[c]++;
}
}
printf("%lld %lld\n",ans,2*anss);
}
return 0;
}
,次数+=2;如果这个数被访问过就次数-=2,vis-=1;push两个当前输入的数