较简单的排队打水,合并果子。。。
合并序列
这是一个堆的问题,就用stl里的优先队列完美搞掉
有两个序列
先sort一下
在算出最小的a[1]+b[1]…..a[1]+b[n]为一组
删掉+如a[i][j+1]
放进去
找最小的k个
#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int x,y,value;
bool operator<(const node &v) const{
return v.value<value;
}
};
priority_queue<node>que;
int a[199099],b[199909],n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for(int i=1;i<=n;i++) {
node p;
p.x=i;
p.y=1;
p.value=a[i]+b[1];
que.push(p);
}
while(n--)
{
node p=que.top();
printf("%d ",p.value);que.pop();
node q;
q.y=p.y+1;
q.x=p.x;
q.value=a[q.x]+b[q.y];
que.push(q);
}
}
中位数
维护一个大根堆和一个小根堆
一直使小根堆的数量+1=大根堆的数量
输出大根堆的头
#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int>que;
priority_queue<int>que2;
int a[190999],b[190999],n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i==1)
{
que2.push(-a[i]);
printf("%d\n",a[i]);
continue;
}
if(a[i]>que2.top()) que2.push(-a[i]);
else que.push(a[i]);
if(que.size()<que2.size())
{
que.push(-que2.top());
que2.pop();
}
if(que.size()>que2.size())
{
que2.push(-que.top());
que.pop();
}
if(i%2==1)
printf("%d\n",-que2.top());
}
}