最大值最小化問題 分治

2021-07-07 07:10:19 字數 1066 閱讀 3744

問題描述: 把乙個包含n個正整數的序列劃分成m個連續的子串行。設第i個序列的各數之和為s(i),求所有s(i)的最大值最小是多少?

例如序列1 2 3 2 5 4劃分為3個子序列的最優方案為 1 2 3 | 2 5 |

4,其中s(1),s(2),s(3)分別為6,7,4,那麼最大值為7;

如果劃分為 1 2 | 3 2 | 5 4,則最大值為9,不是最小。

把乙個包含n個正整數的序列劃分成m個連續的子串行。設第i個序列的各數之和為s(i),求所有s(i)的最大值最小是多少?

例如序列1 2 3 2 5 4劃分為3個子序列的最優方案為 1 2 3 | 2 5 |

4,其中s(1),s(2),s(3)分別為6,7,4,那麼最大值為7;

如果劃分為 1 2 | 3 2 | 5 4,則最大值為9,不是最小。

分析:

此題可以用二分的思想來做。

一串數中,從最小的值到某值為止都能成立,此後都不能成立;或相反,都能使用二分的思想。

#include 

#define max 1000

int totalnum, sequencenum;

int judge(int *array, int test);

int value(int *array, int low, int high);

int main()

}int answer = value(input, minn, maxn);

printf("%d\n", answer);

}int judge(int *array, int test)

}if (sequence >= sequencenum) else

}int value(int *array, int low, int high)

int mid = (low + high) / 2;

if (judge(array, mid) == 1) else

return

0;}

用二分演算法的耗時為o(nlog2(n))。

最大值最小化

1 目標學會用猜數字 二分 的方法,換個角度來解決問題 2 include3 include 4 include5 const int n 100000 6 7int a n n,m,max 89 void input 1018 19 20bool is part int x 是否能把序列劃分為每個...

最大值最小化 題解

題目描述 把乙個包含 n 個正整數的序列劃分為 m 個連續的子串行 每個正整數恰好屬於乙個序列 設第 i 個序列的各數之和為 s i 你的任務是讓所有 s i 的最大值盡量小。例如序列 1 2 3 2 5 4 劃分成 3 個序列的最優方案為 1 2 3 2 5 4,其中 s 1 s 2 s 3 分別...

最大值最小化(maxmin)

分析 給定序列後,我們可以知道任意劃分的最大值的取值範圍 0,sum 1.n 一種較慢的方法是列舉每種取值情況,根據列舉值進行序列劃分,若劃分的組數大於m,說明沒有滿足條件的劃分情況,需要增加列舉值 如果劃分的組數小於m,說明找到了滿足條件的劃分情況。時間複雜度為o n sum 思路擴充套件 既然找...