农夫约翰为了修理栅栏,要将一块很长的木板分割为N块,准备切成的木板的长度为L1,L2......Ln。未切割前木板的长度等于切割后木板的总和,每次切断木板时,需要的开销为这块木板的长度,,例如长度为21的木板要切成长度为8、5、8的三块木板,长为21的木板切成长为13和8时,开销为21,再将长度13的木板切成长度为5和8时开销为13,于是总的开销为34。代码如下:
#include <iostream> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; int main() { int MAX_N=3; int N,L[MAX_N];//要求分割为N块,输入数组的长度 cout<<"N="; cin>>N; cout<<"L={"; for(int i=0;i<MAX_N;i++) { cin>>L[i]; // cout<<",\n"<<endl; } cout<<"}"; ll ans=0; //直到计算到木板为1块为止 while(N>1) { //求出最短的板mii1和次短板mii2 int mii1=0,mii2=1;//初始化 if(L[mii1]>L[mii2]) swap(mii1,mii2);//比较最短和最长的,然后交换位置保证最小 for(int i=2;i<N;i++) { if(L[i]<L[mii1]) { mii2=mii1; mii1=i; } else if(L[i]<L[mii2]) { mii2=i; } } //将两块板合并 int t=L[mii1]+L[mii2]; //也就是节点的数字 ans +=t; if(mii1==N-1) swap(mii1,mii2); L[mii1]=t; L[mii2]=L[N-1]; N--; // cout<<ans<<endl; } cout<<"切割完的最小开销为:"; cout<<ans<<endl; return 0; }