Problem G
万里挑一
时间限制:
2000 ms | 内存限制:
65535 KB
-
描述
- 有两个大小为N的数组A和B,对于每一对(i, j)(0<=i,j<N)都可以得到一个数A[i]+B[j],这样就可以得到N*N个数了,你需要求出前K个大的数,easy?
不解释 看代码
:
#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;
}