农夫约翰为了修理栅栏,要将一块很长的木板切割成N块。准备切成的木板长度为L1、L2、L3、、、LN,未切割前的木板长度恰好为切割后木板长度的总和。每次切断木板时,需要的开销为这块木板的长度。例如长度为21的木板要切成长度为5,8,8的三块木板。长度为21的木板切成长度为13和8的板时,开销为21。再将长度为5和8的板时,开销为13。于是合计开销是34。请求按照目标要求将木板切割完最小的开销是多少。

#include "iostream"
using namespace std; typedef long long ll;
const int MAX_N = 20000;
int N = 3, L[MAX_N] = {8,5,8}; void solve() {
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;
/*
最短板恰好为最后一个板,则交换最短板与次短板坐标,目的让
合成板放在较前位置覆盖掉,次短板交换最后一个板子,并且N-1
如果次短板是最后一个板子则直接N-1被撇除。
*/
if (mii1 == N - 1) swap(mii1,mii2);
L[mii1] = t;
L[mii2] = L[N-1];
N--;
}
cout << ans << endl;
}
int main() {
solve();
system("pause");
return 0;
}

最新文章

  1. Ctrip Mydream
  2. 试听笔记:javascript入门精通
  3. sql文件批量导入mysql数据库
  4. Python爬虫个人梳理(代码有空写)
  5. 原来在linux上切换jdk的版本是这么简单
  6. C++—复合类型
  7. uninstall gitlab
  8. 对Native App与Web App的一些思考
  9. JSON解析保存在类中
  10. FFMPEG视音频编解码零基础学习方法-b
  11. codeforces 598B Queries on a String
  12. 理解WebKit和Chromium(电子书)
  13. 退役之战- SDOI
  14. Android Studio 常用快捷键及常用设置
  15. [C#]左移和右移
  16. pycharm 安装及使用
  17. 关于连接oracle工具plsql的一些使用
  18. 大量删除MySQL中的数据
  19. zabbix准备:nginx安装
  20. Return array from functions in C++

热门文章

  1. Java[4] Jetty工作原理介绍(转)
  2. yii 使用 phpmailer发送邮件
  3. HBase学习(十四)LINUX下用Eclipse构建HBase开发环境
  4. Hadoop-2.2.0中文文档—— Common - CLI MiniCluster
  5. Tomcat全攻略
  6. Nested Class Templates
  7. css3选择符使用个人理解。
  8. html hack 列表
  9. 转载——CLR标量函数、表值函数和聚合函数(UDA)
  10. [c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息