zoukankan      html  css  js  c++  java
  • 51nod 1128 二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1128

    1128 正整数分组 V2

    基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
    收藏
    关注
    给出一个长度为N的正整数数组,不改变数组元素的顺序,将这N个数分为K组。各组中元素的和分别为S1,S2....Sk。如何分组,使得S1至Sk中的最大值最小?
    例如:1 2 3 4 5 6分为3组,{1 2 3} {4 5} {6},元素和为6, 9, 6,最大值为9。也可以分为{1 2 3 4} {5} {6}。元素和为:10 5 6,最大值为10。因此第一种方案更优。并且第一种方案的最大值是所有方案中最小的。输出这个最小的最大值。
    Input
    第1行:2个数N, K,中间用空格分隔,N为数组的长度,K为要分为多少组。(2 <= K < N <= 50000)
    第2 - N + 1行:数组元素(1 <= A[i] <= 10^9)
    Output
    输出这个最小的最大值。
    Input示例
    6 3
    1
    2
    3
    4
    5
    6
    Output示例
    9
    对答案进行二分找到最小值,判定这个值是否合法采用贪心法,在和不超过这个值得情况下一直累计计算最小能分成几个区间,如果区间数小于等于K说明当前值可行,否则不可。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 int A[50005],N,K;
     5 bool ok(LL M)
     6 {
     7     LL s=0,r=0; int i=1;
     8     for(r=0;i<=N;r++,s=0)
     9     {
    10         if(A[i]>M) return 0;
    11         while(s+A[i]<=M&&i<=N){
    12             s+=A[i];
    13             i++;
    14         }
    15     }
    16     return r<=K;
    17 }
    18 int main()
    19 {
    20     int i,j,k;
    21     cin>>N>>K;
    22     for(i=1;i<=N;++i) scanf("%d",A+i);
    23     LL l=1,r=1e15;
    24     while(l<r){
    25         LL mid=l+(r-l)/2;
    26         if(ok(mid)) r=mid;
    27         else l=mid+1;
    28     }
    29     cout<<l<<endl;
    30     return 0;
    31 }
  • 相关阅读:
    UICollectionView
    UIDynamicPPT
    05-UIDynamic
    键盘处理return key-工具条
    源代码管理工具 git
    源代码管理工具
    核心动画09-CATransition转场动画
    核心动画06-时钟(了解)
    Intersect,Minus,union all 和union的区别
    freemarker大于,小于 gt,lt 的用法
  • 原文地址:https://www.cnblogs.com/zzqc/p/7455481.html
Copyright © 2011-2022 走看看