1. 程式人生 > >AOJ890 修理牛棚 【貪心】

AOJ890 修理牛棚 【貪心】

pre inpu 表示 space ret 所在 des clu 思路

題面:

Description
在一個夜黑風高,下著暴風雨的夜晚,農民約翰的牛棚的屋頂、門被吹飛了。 好在許多牛正在度假,所以牛棚沒有住滿。 剩下的牛一個緊挨著另一個被排成一行來過夜。 有些牛棚裏有牛,有些沒有。 所有的牛棚有相同的寬度。 自門遺失以後,農民約翰必須盡快在牛棚之前豎立起新的木板。 他的新木材供應商將會供應他任何他想要的長度,但是供應商只能提供有限數目的木板。 農民約翰想將他購買的木板總長度減到最少。
給出:可能買到的木板最大的數目M(1<=M<=50);牛棚的總數S(1<=S<=200); 牛棚裏牛的總數C(1<=C<=S);和牛所在的牛棚的編號stall_number(1<=stall_number<=S),計算攔住所有有牛的牛棚所需木板的最小總長度。 輸出所需木板的最小總長度作為答案。
Input


1行: M,S和C(用空格分開)
2到C+1行:每行包含一個整數,表示牛所占的牛棚的編號。
Output
單獨的一行包含一個整數表示所需木板的最小總長度。
Sample Input
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
Sample Output
25
Hint
一種最優的安排是用板攔牛棚3-8,14-21,25-31,40-43。

大致思路:

有m塊木板,就意味著將整個塊分割m-1次。
每次選擇間距最大的分割,則可以使最後割掉的間距最大。
將每兩個牛的間距計算,每次找出最大的,然後更新間距。
最後減去總長度就是答案。

代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     ios::sync_with_stdio(false);
 6     //freopen("in.txt","r",stdin);
 7     int pos[210],de[210];
 8     int m,s,c;
 9     cin>>m>>s>>c;
10     for(int i=0;i<c;++i)
11         cin>>pos[i];
12     sort(pos,pos+c);
13 int ans=pos[c-1]-pos[0]+1; //註意這裏的+1,沒有會WA 14 //cout<<ans<<endl; 15 for(int i=0;i<c-1;++i) 16 de[i]=pos[i+1]-pos[i]-1; 17 for(int i=1;i<m;++i){//找m-1次最大間距 18 int maxnl=-1,p=-1; 19 for(int i=0;i<c-1;++i){ 20 if(maxnl<de[i]){ 21 maxnl=de[i]; 22 p=i; 23 } 24 } 25 //cout<<maxnl<<" "<<pos[p]<<endl; 26 ans-=maxnl; 27 de[p]=-1; 28 } 29 cout<<ans<<endl; 30 return 0; 31 }

AOJ890 修理牛棚 【貪心】