本题直接 sort 排序会超时,可以将数字之和作为数组的索引,数组中存放该位置的和出现的次数,从后向前扫描数组,输出 M 个即可。
#include <cstdio>
#include <cstring>
const int MAXN = 3005;
const int MAXS = 10005;
int num[MAXN]; //原数字
int sum[MAXS]; //两两之和
int main()
{
int N, M;
int maxSum;
while (scanf("%d%d", &N, &M) != EOF)
{
for (int i = 0; i < N; i++)
{
scanf("%d", &num[i]);
}
maxSum = 0; //最大的和
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; j < N; j++)
{
++sum[num[i] + num[j]]; //将和作为数组的索引,避免排序
if (num[i] + num[j] > maxSum)
maxSum = num[i] + num[j];
}
}
printf("%d", maxSum); //输出最大的和
--sum[maxSum];
--M;
for (int i = maxSum; i >= 0; i--)
{
while (sum[i] > 0 && M > 0)
{
printf(" %d", i);
--sum[i];
--M;
}
if (M == 0)
break;
}
printf("\n");
memset(sum, 0, sizeof(sum));
}
return 0;
}
继续加油。