求问
查看原帖
求问
574541
Lkxzc316楼主2022/8/22 11:47

思路是开两个数组,一个存放数据,一个用来标记。

每次循环在数组中拓展一位,存放最小和次小之和, 同时更新标记数组。

只有134过了,其他都红了。

#include<stdio.h>
long long guo[20010];
long long mark[20010];
int main()
{
	int n;
	long long ans = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &guo[i]);
		mark[i] = -1;
	}

	for (int i = n; i < 2 * n - 1; i++)
	{
		int min =31000,lmin = 31000;
		int lo_min1 = -1, lo_min2 = -1;
		for (int j = 0; j <= i - 1; j++)
		{
			if (mark[j] == -1)
			{
				if (guo[j] < min)
				{
					lmin = min;
					min = guo[j];
					lo_min2 = lo_min1;
					lo_min1 = j;
				}
				else if (guo[j] < lmin)
				{
					lmin = guo[j];
					lo_min2 = j;
				}
			}
		}
		mark[lo_min1] = 1;
		mark[lo_min2] = 1;
		guo[i] = guo[lo_min1] + guo[lo_min2];
		mark[i] = -1;
		ans += guo[i];
	}
	printf("%lld", ans);
	return 0;
}
2022/8/22 11:47
加载中...