原题:https://pintia.cn/problem-sets/15/problems/866
优先级队列定义:
priority_queue<int,vector<int>,greater<int> >q;//Int类型
//greater 默认为从小到大
//换成less 就是从大到小
本题思路:
将优惠券放入两个队列,分别是存放负值的队列和存放正值的队列;
存放负值的队列从小到大排序,存放正值的相反;
商品价值同理;
根据负负得正,正正还是正,我们将这两队队列一一出队并相乘再相加,得出的结果就是最优解
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q1,p1;//负队列从小到大
priority_queue<int,vector<int>,less<int> >q2,p2;//正从大到小
int main()
{
int n,m,x,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x<0)q1.push(x);//负队列 从小到大排列
else q2.push(x);//正队列是从大到小排列
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
if(x<0)p1.push(x);
else p2.push(x);
}
while(q1.size()&&p1.size())
{
sum+=(q1.top()*p1.top());
q1.pop();p1.pop();
}
while(q2.size()&&p2.size())
{
sum+=(q2.top()*p2.top());
q2.pop();p2.pop();
}
printf("%d",sum);
return 0;
}