标签:
在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。 自门遗失以后,farmer John必须尽快在牛棚之前竖立起新的木板。 他的新木材供应商将会供应他任何他想要的长度,但是吝啬的供应商只能提供有限数目的木板。 farmer John想将他购买的木板总长度减到最少。
给出:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1<= S<=200); 牛棚里牛的总数C(1 <= C <=S);和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为答案。
输入格式:
第 1 行: 木板最大的数目M ,牛棚的总数S 和 牛的总数C(用空格分开)
第 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。
输出格式:
单独的一行包含一个整数表示所需木板的最小总长度。
4 50 18 3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
25
题目翻译来自NOCOW。
USACO Training Section 1.3
这题要求最小长度,可以考虑贪心。首先很明显的是最小长度至少是有牛的牛棚的个数,因为牛棚不一定是连在一起的,所以木板数可能会大于题目给的最大数。如果这样,那么就把相邻的木板连起来(也就是把之间的空都填上),这也就用到了排序,把相邻的空的长度从小到大排一遍,每次去最小的填上。如果填上以后木板数等于给的木板数,那么输出答案
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <queue> 6 #include <stack> 7 #include <vector> 8 #include <iostream> 9 #include "algorithm" 10 using namespace std; 11 typedef long long LL; 12 const int MAX=205; 13 int n,m,c; 14 int a[MAX],b[MAX],d[MAX]; 15 int bla[MAX]; 16 int main(){ 17 freopen ("repair.in","r",stdin); 18 freopen ("repair.out","w",stdout); 19 int i,j; 20 int num(0),len,first; 21 scanf("%d%d%d",&m,&n,&c); 22 len=c; 23 memset(b,0,sizeof(b)); 24 for (i=1;i<=c;i++) 25 {scanf("%d",a+i); 26 b[a[i]]++; 27 } 28 for (i=1;i<=n;i++) 29 if (b[i]>0 && b[i-1]==0) 30 num++; 31 if (num<=m) 32 {printf("%d",len); 33 return 0; 34 } 35 d[1]=0; 36 for (i=2;i<=n;i++) 37 if (b[i-1]>0) 38 d[i]=0; 39 else 40 d[i]=d[i-1]+1; 41 for (first=1;b[first]==0;first++); 42 bla[0]=0; 43 for (i=first+1;i<=n;i++) 44 if (b[i]>0 && d[i]!=0) 45 bla[++bla[0]]=d[i]; 46 sort(bla+1,bla+bla[0]+1); 47 for (i=1;i<=num-m;i++) 48 len+=bla[i]; 49 printf("%d",len); 50 return 0; 51 }
[USACO1.3]修理牛棚 Barn Repair (贪心)
标签:
原文地址:http://www.cnblogs.com/Michaelzzn/p/5751427.html