4 3 1 2 3 4 3 6 5 4
9 9 10
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int a[100001],b[100001];
struct node {int v; int n;node(){}node(int a,int b):v(a),n(b){} //不断更新新的队列bool operator < (const node& tmp ) const{return v< tmp.v; //使队列维护从大到小的性质}
};
bool cmp(int aa,int bb)
{return aa > bb;
}
void fun(int *A,int *B,int *C,int n)
{priority_queue<node> q;int i;for( i = 0 ; i < n ; i++)q.push(node(A[i]+B[0],0));//先入队列n个数(第一个数是最大的)for( i = 0 ; i < n ; i++){node tmp = q.top(); q.pop(); //每次最大的数出队列,并保存到数组C中C[i] = tmp.v; //也就是a中,重新赋值节约资源int b = tmp.n; //初始值为0,表示最大数的下标if(b<n-1) //保证下标数至少两个,{q.push(node(tmp.v - B[b] +B[b+1],b+1));//下标加1,表示第二大的数//tmp.v -B[b] + B[b+1] 是小于等于tmp.v的一个数入队列}}
}
int main()
{int k,i,n;while(scanf("%d%d",&n,&k)!=EOF){for(i = 0 ; i < n ; i++)scanf("%d",&a[i]);for(i = 0 ; i < n ;i++)scanf("%d",&b[i]);sort(a,a+n,cmp); sort(b,b+n,cmp); //将a,b都从小到大排列fun(a,b,a,k);printf("%d",a[k-1]);for(i = k -2 ;i>= 0 ;--i)printf(" %d",a[i]);printf("n");}}
本文发布于:2024-01-30 22:24:50,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170662469323259.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |