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

原创 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))。

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

相关文章推荐

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

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

最大值最小化问题

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

二分答案方法 — 最大值最小化问题

最大值最小化问题(分治解法) 把一个包含n个正整数的序列划分成m个连续的子序列(每个正整数恰好属于一个序列)。设i个序列的各数之和为S(i),你的任务是让所有S(i)的最大值尽量小 #...

UVa 714 Copying Books 二分 + 贪心 (最大值最小化问题)

/** * 最大值最小化问题: 二分法。 刘汝佳那本白书上也说的很详细。 * 先把最大值的可能区间计算出来,也就是[0, maxAns] maxAns 就是所有页数总和。 * 然后再在答...

最大值最小化问题

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

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

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

最大值最小化问题

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

Uva 714Copying Books,(最大值最小化问题)

题意: 把一个包含N个正整数的序列划分成M个连续的子序列

uva--714+二分(最大值最小化问题)

题意:      原题意比较啰嗦,大概的意思就是输入n个整数,然后将他们分成m段,要求求出这m段中最大和最小时候的情况。输出的时候段与段之间用"/"分离,当有多个解时,输出第一段值最小的,第一段相同...

数据结构——最大值最小化 (划分子序列)

第一次写博客,就把第一篇文章给今天在sicily
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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