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

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

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

相关文章推荐

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

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

最小化子序列的最大值的和

这是一个动态规划的初级入门,里面你能看到动态规划的解题方法,以及没有学过动态规划的人,那些暴力的解法。通过对比,可以看出动态规划算法的优越性。...

最大连续子序列和:动态规划经典题目(2)

问题描述:       连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。       比如例如给定序列:            { -2, 11, -4, 13, -5,...

动态规划dp经典题目:最大连续子序列和

给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 ...

动态规划与钢条切割问题 C++实现

动态规划一、原理我们可以用拉格朗日乘数法,求解给定条件下的方程最优解,同样,动态规划算法也是用于在一定条件下的求解最优解的方法。它和分治方法很相似,都是通过组合子问题来求解原问题。一般适用于动态规划算...

最大的算式(BigExp) 动态规划

还记得是去年做的DP题目,题目大意如下: 给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相...

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

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

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

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

最大值最小化问题

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

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

题意: 把一个包含N个正整数的序列划分成M个连续的子序列
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大值最小化问题——分治
举报原因:
原因补充:

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