andre_joy

导航

USACO barn1

题意:有很多隔间,部分隔间被奶牛占领,要修墙,连在一起的算一面墙,给定墙的最大面数,问怎么修,才能使其包括所有被奶牛占有的地方都能被包围并且墙的总占地最小。

mark:wa了一次,写到最后糊涂了一下。。仔细就好。

代码:

/*
ID: andre_j2
LANG: C
TASK: barn1
*/
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

main()
{
    freopen("barn1.in", "r", stdin);
    freopen("barn1.out", "w", stdout);
    int m,s,c,a[210],b[210];
    int i,j,k,f,min;
    scanf("%d%d%d", &m, &s, &c);
    for(i = 0; i < c; i++)
        scanf("%d", a+i);
    qsort(a, c, 4, cmp);
    for(i = f = min = j = 0; i < c-1; i++)
    {
        if(a[i]+1 != a[i+1])
        {
            min += a[i]-a[j]+1;
            b[f++] = a[i+1]-a[i]-1;
            j = i+1;
        }
    }
    min += a[i]-a[j]+1;
    qsort(b, f, 4, cmp);
    j = f-m+1;
    for(i = 0; i < j; i++)
        min += b[i];
    printf("%d\n", min);
    exit(0);
}

posted on 2012-07-11 11:08  andre_joy  阅读(118)  评论(0编辑  收藏  举报