USACO 1.3.2 Barn Repair

USACO 1.3.2 Barn Repair

简单的贪心,最初先把每个需要覆盖的点分别覆盖,这时候所需的东东一般会超过给你的东东。
超过多少呢?假设为n吧,这个样你需要选择n个空白档(即已经覆盖的两个牛棚间的空白牛棚)
也把他们覆盖掉,这样每覆盖 一个,n就能减少1,直到n=0就算完成任务。
之所以是贪心,因为我们在选择那n个空白档的时候是从小到大选的。
同样的,也可以用hash的思想精简代码。

 1  /*
 2    ID : 31440461
 3    PROG : barn1
 4    LANG : C++
 5  */
 6  #include  < iostream >
 7  using   namespace  std;
 8  const   int  MAXS = 200 + 10 ;
 9 
10  int  main()
11  {    
12      freopen( " barn1.in " , " r " ,stdin);
13      freopen( " barn1.out " , " w " ,stdout);
14       int  m,s,c;
15      cin  >>  m  >>  s  >>  c;
16       bool  a[MAXS];
17      memset(a, 0 , sizeof (a));
18       int  x;
19       for  ( int  i = 0 ;i < c;i ++ ) cin  >>  x, a[x] = 1 ;
20       int  cou[MAXS];
21      memset(cou, 0 , sizeof (cou));
22      x = 1 ;
23       while  ( ! a[x]) x ++ ;
24       for  ( int  i = x + 1 ;i < MAXS;i ++ )
25          if  (a[i])  ++ cou[i - x - 1 ], x = i;
26       if  (m >= c) { cout  <<  c  <<  endl; return   0 ;}
27      x = c - m;
28       int  ans = 0 ;
29       for  ( int  i = 0 ;i < MAXS;i ++ )
30      {
31          x -= cou[i];
32          ans += i * cou[i];
33           if  (x <= 0 ) {ans -= ( - x) * i; break ;}
34      }
35      cout  <<  ans + <<  endl;
36       return   0 ;
37  }
38 
39             
40         
41 


你可能感兴趣的:(USACO 1.3.2 Barn Repair)