粉刷柵欄演算法問題

2021-06-29 09:20:12 字數 834 閱讀 3792

在網易雲上面看到這道問題,跟大家分享一下,也不知道思路有沒有問題。望指正。

題目如下:

給定一組長度為 n 的柵欄,從左到右高度依次是 h[i]。

你需要對這個柵欄粉刷油漆,每次你可以粉刷一行或者一列。

問最少粉刷幾次,可以給所有柵欄上漆。(不能多刷)

輸入格式:

第一行包含乙個整數,表示柵欄的長度。

接下來的一行,包含 n 個數(n <= 100000),依次表示 h[i](h[i] <= 10^9)。

輸出格式:

輸出一行表示對應的答案。

輸入樣例:

52 2 1 2 1

輸出樣例:

3第一眼看到沒有什麼思路,但是通過分析問題發現,可以採用分治法來解決。首先將問題分解為小問題,然後考慮兩個子問題的合併。通過簡單的距離畫圖,我們可以了解到,假設兩個子問題,左邊a至少需要m次,右邊b需要n次粉刷,那麼兩者合併的時候考慮兩者相鄰的元素,即a的最右與b的最左相比較,如果兩者相等的話,那麼合併後最少需要粉刷的次數則為a和b中的較大者,即說明兩者有乙個公共次數,即max(a, b);若兩者不相等,則需要另外一次,即為max(a, b) + 1。這樣就好做了。**如下:

#include #include using namespace std;

int paint(vector&x, int b, int e)

else

}int main()

; cout<< "least paint time is : " << paint(v, 0, v.size() - 1) << endl;

return 0;

}

(紀中)1746 粉刷柵欄

file io input paint.in output paint.out 時間限制 1000 ms 空間限制 128001 kb 具體限制 goto problemset 題目描述 農夫約翰最近正在將他的柵欄粉刷一下 這裡所有的柵欄都是在一條直線上的 他是這樣來粉刷的 他從位置0 00出發,然...

Hrbust 2225 粉刷柵欄 分治

粉刷柵欄 time limit 500 ms memory limit 32768 k total submit 111 35 users total accepted 34 24 users rating special judge no description 給定一組長度為 n 的柵欄,從左到...

HRBUST 2225 粉刷柵欄(分治)

給定一組長度為 n 的柵欄,從左到右高度依次是 h i 你需要對這個柵欄粉刷油漆,每次你可以粉刷一行或者一列。問最少粉刷幾次,可以給所有柵欄上漆。不能多刷 input 第一行包含乙個整數,表示柵欄的長度。接下來的一行,包含 n 個數 n 5000 依次表示 h i 0 h i 10 output 輸...