码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO1.3]修理牛棚 Barn Repair (贪心)

时间:2016-08-09 00:06:08      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

在一个夜黑风高,下着暴风雨的夜晚,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行: 每行包含一个整数,表示牛所占的牛棚的编号。

 

输出格式:

 

单独的一行包含一个整数表示所需木板的最小总长度。

 

输入输出样例

输入样例#1:
4 50 18
3 
4 
6 
8 
14
15 
16 
17 
21
25 
26 
27 
30 
31 
40 
41 
42 
43
输出样例#1:
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!