给N(N<=3000)个整数ki,(ki<=5000) ,两两求和,从大到小输出前M个和
Input
多组数据: 第一行两个数 第二行N个数ki(0<i<N)
Output
从大到小输出前M个和
Sample Input
4 4 1 2 3 4 4 5 5 3 6 4
Sample Output
7 6 5 5 11 10 9 9 8
思路:
我最初的思路是选出前y个最大的值,觉得答案就在这前y个值中出现,但后来一想,不对,如果前y个中有一个非常大的,答案不会只出现在前y个中,之后用到桶排序,得出答案。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
const int N =11000;
int n,k;
int a[N],b[N],ma=0;
bool cmp(int c,int d)
{
return c>d;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
b[a[i]+a[j]]++;
int t=k;
for(int i=10000;i>=0;i--)
{ while(k>0&&b[i]>0)
{ if(t==k)
printf("%d",i);
else
printf(" %d",i);
k--;
b[i]--;
}
}
printf("\n");
}
return 0;
}