Fence Repair (POJ 3253)
2024-10-20 16:10:53
农夫约翰为了修理栅栏,要将一块很长的木板切割成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;
}
最新文章
- Ctrip Mydream
- 试听笔记:javascript入门精通
- sql文件批量导入mysql数据库
- Python爬虫个人梳理(代码有空写)
- 原来在linux上切换jdk的版本是这么简单
- C++—复合类型
- uninstall gitlab
- 对Native App与Web App的一些思考
- JSON解析保存在类中
- FFMPEG视音频编解码零基础学习方法-b
- codeforces 598B Queries on a String
- 理解WebKit和Chromium(电子书)
- 退役之战- SDOI
- Android Studio 常用快捷键及常用设置
- [C#]左移和右移
- pycharm 安装及使用
- 关于连接oracle工具plsql的一些使用
- 大量删除MySQL中的数据
- zabbix准备:nginx安装
- Return array from functions in C++
热门文章
- Java[4] Jetty工作原理介绍(转)
- yii 使用 phpmailer发送邮件
- HBase学习(十四)LINUX下用Eclipse构建HBase开发环境
- Hadoop-2.2.0中文文档—— Common - CLI MiniCluster
- Tomcat全攻略
- Nested Class Templates
- css3选择符使用个人理解。
- html hack 列表
- 转载——CLR标量函数、表值函数和聚合函数(UDA)
- [c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息