1. 程式人生 > >2018CCPC網絡賽A(優先隊列,思維)

2018CCPC網絡賽A(優先隊列,思維)

c++ 升值 con 超出 隊列 sof 曾經 tmp 之前

#include<bits/stdc++.h>
using namespace std;
priority_queue<pair<int,int>>q;
int main()
{
int t;
int n;
scanf("%d",&t);
while(t--)
{
while(!q.empty())
q.pop();
scanf("%d",&n);
long long sum=0;
int times=0;
long long tmp=0;


int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
q.push({-x,1});//買入
q.push({-x,2});//賣出
tmp=x+q.top().first;//如果前面沒有比它更小的,相當於放進去一個標記為1的
//如果有比它更小的,相當於執行買賣
if(q.top().second==1)//除了第一次進隊列的價值以外都是標記為2的在前,當它第一次被交易時,
//不記次數,相當於之前的商品升值,如果計數則會超出答案

times+=2;//交易兩次
sum+=tmp;
q.pop();
}
printf("%lld %d\n",sum,times);
}
return 0;
}

//曾經嘗試不使用pair放入隊列,或者多重集升序排序,另開vis數組來判斷是否增加times,結果RE,反思+自閉

2018CCPC網絡賽A(優先隊列,思維)