1. 問題の説明
2.シーン構築
請負業者のシャオ・リウが道路を舗装しようとしていました.建設現場は一連のレンガを与えました.これらのレンガはさまざまな長さでした.道路は固定されており、レンガは間違いなく舗装できるはずです.各レンガの位置レンガは道を舗装しました。
3.貪欲な戦略選択
ここで、建設現場から渡されたレンガが、レンガの開始位置に従って左から右に配置されているとします (数軸の値は低い方から高い方です)。また、レンガの長さも低い方から配置されています。高へ (つまり、X = ln で l1 <= l2 <= ... <、li = li+1、ui <= ui+1 の場合)
Xiao Liu は、この方法を使用して道を開くことにしました。
毎回選択されたブリックは、前のブリックに接続されることが保証されます
前進する道を開くことができるより多くのレンガを優先する
4. コードとコメントの詳細な説明
X[7][2] = { {1,2},{1,6},{2,7},{4,8},{7,9},{8, 10} として例を示します。 ,{9,10}}
出力結果を次の図に示します。
最小タイル パス、最小タイル パスの長さによって選択されたレンガをそれぞれ出力します。
以下、コードとコメント
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
// 贪心策略:
// 每次选择的砖块,在保证能和前一块砖块连接的基础上
// 尽量选择往前铺的路更多的
int Min_road(double X[][2], int size){
int new_road = 0; // 最新的被选进最小平铺路径的砖块下标
double cover_end = X[0][0]; // 目前路径铺到哪里了(工程进度)
int search = 0; // 找到第几块地砖了(目前遍历到的地砖下标)
int count = 0; // 目前最小平铺路径中的地砖数量
int X_length = size;
// 遍历地砖,寻找最小平铺路径的地砖
while(search < X_length){
double blank_coverage = 0; // 选择的地砖能再往前铺多少长度的路
int bc_record = new_road; // 选择的地砖的下标
for(; search<X_length && X[search][0]<=cover_end; search++){ // 找的地砖开始不能和前一块脱节,就退出本次查找
if(X[search][1]-X[new_road][1]>=blank_coverage){ // 如果当前地砖铺的路更多
blank_coverage = X[search][1]-X[new_road][1]; // 记录这块地砖以及它铺的路的长度
bc_record = search;
}
}
new_road = bc_record; // 将地砖纳入最小平铺路径
cover_end = X[new_road][1]; // 更新工程进度
count++; // 更新砖块数量
cout << "[" << X[new_road][0] << ", " << X[new_road][1] << "] ";
if (X[new_road][1] == X[size-1][1]) // 路铺完了,立即结束工程
break;
}
return count;
}
int main(){
double X[7][2] = {
{1,2},{1,6},{2,7},{4,8},{7,9},{8,10},{9,10}};
int count = Min_road(X, 7);
cout << '\n' << "长度为:" << count;
}