蒟蒻20分呜呜呜
查看原帖
蒟蒻20分呜呜呜
816549
52wyd楼主2022/12/6 19:19
#include <stdio.h>
#include <algorithm>
using namespace std;

int a[10010];

int main(void)
{
	long long sum;
	int n, i, ct;
	scanf("%d", &n);
	
	for (i = 0; i <= n - 1; i ++)
		scanf("%d", &a[i]);
	
	sort(a, a + n);// 对数组排序
	
	sum = ct = 0;//sum:体力消耗,ct:搬运的次数
	while (ct != n - 1)//当搬运n-1次时结束
	{
		int min1, min2, b1, b2, flag = 0;
      //min1第一小 b1第一小对应的下标  
		for (i = 0; i <= n - 1; i ++)
		{
			if (a[i] != 0)//如果这个地方有果子
			{
				if (flag == 0)//初始化min1 b1
				{
					min1 = a[i]; b1 = i;
					flag = 1;
				}
				else if (flag == 1)//初始化min2 b2
				{
					if (a[i] > min1)
					{
						min2 = a[i]; b2 = i;
					}
					else
					{
						min2 = min1; b2 = b1;
						min1 = a[i]; b1 = i;
					}
					flag = 2;
				}
				else if (flag == 2) //min1 min2 b1 b2 初始化之后的情况
				{
					if (a[i] < min1 && a[i] < min2)
					{
						min2 = min1; b2 = b1;
						min1 = a[i]; b1 = i;
					}
					else if (a[i] > min1 && a[i] < min2)
					{
						min2 = a[i]; b2 = i;
					}
				}
			}
		}
		sum += min1 + min2; //体力消耗为最轻的两堆重量之和
		a[b1] += a[b2]; //将这两堆合并到其中一堆的位置
		a[b2] = 0;//另一堆的地方没有果子了
		ct ++;//搬运次数++
	}
	
	printf("%lld\n", sum);//输出体力消耗
	return 0;
}


2022/12/6 19:19
加载中...