HDU 1280(前m大的数)

本题直接 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;
}

继续加油。

发布了206 篇原创文章 · 获赞 1 · 访问量 8983

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104849191