思路是开两个数组,一个存放数据,一个用来标记。
每次循环在数组中拓展一位,存放最小和次小之和,
同时更新标记数组。
只有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;
}