最大值最小化问题——分治

原创 2015年11月18日 15:40:50

问题描述: 把一个包含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 <stdio.h>
#define max 1000
int totalnum, sequencenum;
int judge(int *array, int test);
int value(int *array, int low, int high);

int main() {
    scanf("%d%d", &totalnum, &sequencenum);
    int maxn, minn = max;
    int input[max];
    for (int i = 0; i < totalnum; i++) {
        scanf("%d", &input[i]);
        maxn += input[i];
        if (minn > input[i]) {
            minn = input[i];
        }
    }
    int answer = value(input, minn, maxn);
    printf("%d\n", answer);
}

int judge(int *array, int test) {
    int sum = 0;
    int sequence = 0;
    for (int i = 0; i < totalnum; i++) {
        sum += array[i];
        if (sum > test) {
            sum = array[i];
            sequence++;
        }
    }
    if (sequence >= sequencenum) {
        return 0;
    } else {
        return 1;
    }
}

int value(int *array, int low, int high) {
    if (low > high) {
        return high + 1;
    }
    int mid = (low + high) / 2;
    if (judge(array, mid) == 1) {
        return value(array, low, mid - 1);
    } else {
        return value(array, mid + 1, high);
    }
    return 0;
}

用二分算法的耗时为o(nlog2(n))。

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何理解最大化最小值问题和最小化最大值问题

想把这两个问题作一个比较通俗的解释,方便笔者和各位读者对此问题有更直观的理解。 (一)min-max问题 先理解这个问题,借用之前看到的一个例子:考虑规划城市中急救中心或者消防中心的建造位置,...
  • yxnd150150
  • yxnd150150
  • 2016年11月29日 12:04
  • 941

最大值最小化问题

问题描述可参考最大值最小化问题,问题在刘汝佳老师的算法竞赛入门经典书上的p151页,核心算法是二分法猜最大值,猜对了继续小化,猜错了增大数字,初始左值为序列第一个元素值,右值为序列和。 下面是我的C+...
  • barry283049
  • barry283049
  • 2015年01月15日 21:59
  • 1530

最大值最小化问题

From: http://www.cnblogs.com/gentleming/archive/2010/07/16/1778926.html Question: 把一个包含n个正整数的序列划分成...
  • nomad2
  • nomad2
  • 2012年08月05日 22:24
  • 2370

最大值最小化问题——分治

问题描述: 把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少? 例如序列1 2 3 2 5 4划分为3个子序列的最优方案为 1...
  • stary_yan
  • stary_yan
  • 2015年11月18日 15:40
  • 925

二分法解决最大值最小化问题

问题描述:把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少?例如序列1 2 3 2 5 4划分为3个子序列的最优方案为 1 2 3 ...
  • Lrrent
  • Lrrent
  • 2015年12月20日 10:23
  • 1170

【算法设计与数据结构】二分法解决最大值最小化问题—进阶篇— URAL 2034 Caravans

题目大意 一辆卡车从起点s到终点f,走的是最短路径。强盗从r出发前往卡车途经的某个点拦截,同样,强盗选择最近的点。卡车走的最短路径可能有多条,求最坏情况下强盗花费的时间。 简而言之,两个步骤: ...
  • jiange_zh
  • jiange_zh
  • 2015年09月04日 00:00
  • 1010

计算最大值和最小值(分治法)

分治法计算最大值和最小值,是一个经典的算法程序。 原始数据使用随机函数生成。 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。 数据个数由宏定义给出,也...
  • tigerisland45
  • tigerisland45
  • 2016年04月21日 12:17
  • 1567

JFrame中最大化最小化问题技巧

在用JFrame中有时候需要捕获最大化、最小化等操作,或者期望程序一运行就最大化或最小化。 捕获JFrame的最小化、最大化事件,可以通过给JFrame添加自己的actionListener来实现,...
  • fick777
  • fick777
  • 2011年12月22日 13:23
  • 2839

一个SWT应用程序窗口最大化最小化问题?

swt的window是有 shell控制的,因此改变它的相关属性即可 Shell shell = new Shell(SWT.MIN | SWT.CLOSE | SWT.MAX); 这样就可...
  • szyyyp
  • szyyyp
  • 2015年01月08日 15:12
  • 2158

【算法设计与数据结构】二分法解决最大值最小化问题——入门篇

问题描述把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少? 例子: 序列1 2 3 2 5 4划分为3个子序列的最优方案为 1 2...
  • jiange_zh
  • jiange_zh
  • 2015年09月03日 13:54
  • 1831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大值最小化问题——分治
举报原因:
原因补充:

(最多只允许输入30个字)