AOJ890 修理牛棚 【貪心】
阿新 • • 發佈:2017-08-16
pre inpu 表示 space ret 所在 des clu 思路
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。
題面:
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 修理牛棚 【貪心】