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); }