zoukankan      html  css  js  c++  java
  • FZYZOJ-1578 [NOIP福建夏令营]数列分段

    P1578 -- [NOIP福建夏令营]数列分段

    时间限制:1000MS      内存限制:131072KB

    状态:Accepted      标签:    二分   无   无

    Description

    对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小。

    关于最大值最小:

    例如一数列4 2 4 5 1要分成3段

    将其如下分段:[4 2][4 5][1]

    第一段和为6,第2段和为9,第3段和为1,和最大值为9。

    将其如下分段:[4][2 4][5 1]

    第一段和为4,第2段和为6,第3段和为6,和最大值为6。

    并且无论如何分段,最大值不会小于6。

    所以可以得到要将数列4 2 4 5 1要分成3段,每段和的最大值最小为6。

    Input Format

    输入的第1行包含两个正整数N,M,第2行包含N个空格隔开的非负整数A[i],含义如题目所述。

    Output Format

    输出仅包含一个正整数,即每段和最大值最小为多少。

    Sample Input

    5 3
    4 2 4 5 1
    

    Sample Output

    6

    Hint

    对于20%的数据,有N≤10;

    对于40%的数据,有N≤1000;

    对于100%的数据,有N≤100000,M≤N, A[i]之和不超过5.1*10^9。

    题解

           遇到“最大值最小”、“最小值最大”的题目往往采用二分答案的方法。二分区间应该是[Max{A[i]},Sigma(A[i])]。用Mid当做最大值进行判定,若分的组数大于M,说明Mid < Ans,则L = Mid + 1;否则,分的组数小于等于M,说明Mid >= Ans,那么R = Mid。注意每次得到判定结果后要分析Mid和Ans的关系,来判断每次L和R的变化。

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #define MAXN 100010
     4 using namespace std;
     5 
     6 int N, M;
     7 long long A[MAXN];
     8 long long L, R, Mid;
     9 
    10 int Max(int A, int B) {
    11     return A > B ? A : B;
    12 }
    13 
    14 bool Judge(int X) {
    15     long long Sum = 0;
    16     int Cnt = 1;
    17     for (int i = 1; i <= N; ++i) {
    18         if (Sum + A[i] > X) {
    19             ++Cnt;
    20             Sum = A[i];
    21         }
    22         else Sum += A[i];
    23     }
    24     return Cnt > M;
    25 }
    26 
    27 int main() {
    28     scanf("%d%d", &N, &M);
    29     for (int i = 1; i <= N; ++i) {
    30         scanf("%lld", &A[i]);
    31         L = Max(A[i], L);
    32         R += A[i];
    33     }
    34     while (L < R) {
    35         Mid = (L + R) >> 1;
    36         if (Judge(Mid)) L = Mid + 1;
    37         else R = Mid;
    38     }
    39     printf("%d
    ", L);
    40 }
  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/DonMaestro/p/4324178.html
Copyright © 2011-2022 走看看