Fence Repair

匿名 (未验证) 提交于 2019-12-03 00:09:02

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!