农夫约翰为了修理栅栏,要将一块很长的木板分割为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;
}
01-20 02:10