输入样例
4 4
1 2 3 4
4 5
5 3 6 4
输出样例
7 6 5 5
11 10 9 9 8
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
int a[3005],b[10005];//根据题意数组不要开的过大,一个数不超过5000,所以和不超10000
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++)
cin>>a[i];
memset(b,0,sizeof(b));//数组每一个数都清零
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
b[a[i]+a[j]]++;//计算每两两相加和的数 ,个数加一
}
}
//比如a[7]=1
// a[6]=1
// a[5]=2
int j=10000;//定义大一点从高到低逐个判断实现排序
for(int i=0;i<m;i++){//和26行共同实现只输出最大的前m项
while(b[j]==0){//从高到低15行没出现的数字就j--,那找到的出现的一定是最大数
//比如b[10000]=0,所以判断下一个b[9999],直到b[7]
j--;
}
printf(i==0?"%d":" %d",j);
b[j]--;//个数减一
}
printf("\n");
}
}