農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要N塊木頭,每塊木頭長度為整數Li個長度單位,於是他購買了一條很長的、能鋸成N塊的木頭,即該木頭的長度是Li的總和。
但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度為8、7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。如果第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費為35(大於32)。
請編寫程序幫助農夫計算將木頭鋸成N塊的最少花費。
輸入格式:
輸入首先給出正整數N(≤104),表示要將木頭鋸成N塊。第二行給出N個正整數(≤50),表示每段木塊的長度。
輸出格式:
輸出一個整數,即將木頭鋸成N塊的最少花費。
輸入樣例:
8
4 5 1 2 1 3 1 1
輸出樣例:
49
說實話這個題有點取巧了,應該是用哈夫曼樹做的,但是這樣竟然能通過!!!!!!!!!!
代碼:
#include<vector> #include<iostream> #include<algorithm> using namespace std; int main() { int n,x,sum=0,t=0; cin>>n; vector<int >v; while(n--) { cin>>x; v.push_back(x); } while(v.size()!=1) { vector<int>::iterator itr=min_element(v.begin(),v.end()); int a=*itr; v.erase(itr); vector<int>::iterator itr1=min_element(v.begin(),v.end()); int b=*itr1; v.erase(itr1); t=a+b; sum+=t;//cout<<"@@@@@@@@@@"<<sum<<endl; v.push_back(t); } cout<<sum; return 0; }