NYOJ 万里挑一

万里挑一

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 5
描述
有两个大小为N的数组A和B,对于每一对(i, j)(0<=i,j<N)都可以得到一个数A[i]+B[j],这样就可以得到N*N个数了,你需要求出前K个大的数,easy?
输入
输入可能会有多组(小于十组),每组3行数据,第一行是两个整数N( N <= 100000 ) 和K(K<=N),接下来2行,每行N个整数,每行的整数都用空格隔开
输出
每组一行,最大的K个数,用空格隔开,从小到大输出。
样例输入
4 3
1 2 3 4
3 6 5 4
样例输出
9 9 10
来源

郑大第六届校赛

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#define MAX 100005
using namespace std;
int A[MAX],B[MAX];
bool comp(const int &a,const int &b){
	return a>b;
}
struct cmp{
	bool operator()(const int &a,const int &b){
		//优先队列内元素由小到大排列 
		return a>b;
	}
};
int main(){
	int N,K;
	while(cin>>N>>K){
		priority_queue<int,vector<int>,cmp>pq;
		for(int i=0;i<N;i++){
			//cin>>A[i];
			scanf("%d",&A[i]);
		}
		for(int i=0;i<N;i++){
			//cin>>B[i];
			scanf("%d",&B[i]);
		}
		
		//程序主要思想 
		// 将A,B,数组由大到小排列,让A中最大的数从B中加K个数,得到的这K个数可能为 最大的K个数
		//然后再让A第二大的数从B中加数,若有一个小于A[i] +B[j]小于pq.top(),说明此时B中余下的数加A[i]都不会大于 pq.top(),break
		//若发现有大于pq.top()的数,入队 
		sort(A,A+N,comp),sort(B,B+N,comp);
		for(int i=0;i<K;i++){
			pq.push(A[0]+B[i]);
		}	
		for(int i=1;i<N;i++){
			for(int j=0;j<N;j++){
				int num=A[i]+B[j];
				if(num<pq.top()){
					break;
				}
				else {
					pq.pop();
					pq.push(num);
				}
			}
		}
		while(K--){
			printf("%d ",pq.top());
			pq.pop();
		}
	}
}

sort ,与priority_queue 自定义comp的区别可以认为:

sort中按comp的中大小顺序排列数组即在comp中return a>b 则数组按由大到小排列

而priority_queue中

struct comp{
bool operator()(const int &a,const int &b){
//优先队列内元素由小到大排列 ,若由大到小排列则为<
return a>b;
}
};

与sort的comp相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值