POJ 3253(Fence Repair)

解法一:

#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类型,否则容易导致溢出问题。。

猜你喜欢

转载自blog.csdn.net/CaspianSea/article/details/85221386