解法一:
#include <stdio.h>
#define N 20000
int count;
int planks[N];
int partition(int start, int end)
{
int i, j;
j = start - 1;
for( i = start; i < end; i++)
{
if(planks[i] < planks[end])
{
j++;
int tmp = planks[i];
planks[i] = planks[j];
planks[j] = tmp;
}
}
j++;
int tmp = planks[i];
planks[i] = planks[j];
planks[j] = tmp;
return j;
}
void sort( int start, int end)
{
if( start < end)
{
int p = partition(start, end);
sort(start, p - 1);
sort(p+1, end);
}
}
long long get_minimum( long long total)
{
sort(0, count - 1);
long long cost = 0;
int i = 0;
while(count > 1)
{
cost += planks[0] + planks[1];
int x = planks[0] + planks[1];
int j;
int k = 0;
for(j = 2; j < count && planks[j] < x; j++)
{
planks[k++] = planks[j];
}
planks[k++] = x;
for(; j < count; j++)
{
planks[k++] = planks[j];
}
count--;
}
return cost;
}
int main(void)
{
//freopen("2.txt", "r", stdin);
scanf("%d", &count);
int i;
long long total = 0;
for( i = 0; i < count; i++)
{
scanf("%d", planks+i);
total += planks[i];
}
printf("%lld\n", get_minimum(total));
return 0;
}
cost一定要用 long long类型,否则容易导致溢出问题。。