南阳理工学院12月份月赛(高年级组) 大水题

Problem G

万里挑一

时间限制: 2000 ms  |  内存限制: 65535 KB
描述
有两个大小为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
来源
郑大第六届校赛
上传者

521521


不解释  看代码

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int a[100000+10],b[100000+10],ans[100000+10];
	priority_queue<int,vector<int>,greater<int> >que;//大的优先
int main()
{
	int i,j,n,k,num;
	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,greater<int>());//从大到小
	    sort(b,b+n,greater<int>());//从大到小
		for(i=0;i<k;i++)
		{
			  que.push(a[i]+b[i]);
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				if(i==j) continue;
				num=a[i]+b[j];
                  if(num<=que.top()) break;
				  else 
				  {
					  que.push(num);
					  que.pop();
				  }
			}
		}
		 
	    printf("%d",que.top());
		que.pop();
		while(!que.empty())
		{
			printf(" %d",que.top());
			 que.pop();
		}
		printf("\n");
	//	i--;
	//	for(i;i>0;i--)
		//	printf("%d ",a[i]);
		//printf("%d\n",a[0]);
	    

	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值