zoukankan      html  css  js  c++  java
  • poj 3273 二分枚举

    题意:给出一个有n个数据的数组,将其分为连续的m份,找到一种分法,是的m份中最大一份总和最小

    参考博客:http://blog.csdn.net/qq_22902423/article/details/50601451

    题解:一种方案中最大的那部分总和num存在一个范围,num总大于等于数组中最大的那个数,总小于等于整个数组的和。得到了一个范围a~b,用二分法不断缩小范围,比如第一次取mid = a + (a - b) / 2, 那么分组时候每组最大为mid,分到最后一个得到的组数如果小于等于m那就将范围缩小到a~mid,如果分得的组数大于m,那就将范围缩小到mid~b,直到不能缩小了就能得到最优值了。

    看网上说的是一般求最大值最小化或者最小值最大化用的就是二分,暂时还没有做过其他例题,等找到了再来补充

    此题代码如下:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int A[100005];int m, n;
    int solve(int x)
    {
        int sum = 0;int k = 0;
        for(int i = 0; i < n; i++)
        {
            sum += A[i];
            if(sum > x)
            {
                k++;
                sum = A[i];
            }
        }
        k++;
        return k;
    }
    int main()
    {
    
        scanf("%d%d", &n, &m);
        int ma = 0;
        int mi = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &A[i]);
            mi = max(mi, A[i]);
            ma += A[i];
        }
        int lef = mi, rig = ma;
        int ans = 0xffffff;
        while(lef <= rig)
        {
            int mid = lef + (rig - lef) / 2;
            int num = solve(mid);
            if(num <= m)
            {
                ans = min(ans, mid);
                rig = mid - 1;
            }
            else lef = mid + 1;
        }
        cout << ans << endl;
        return 0;      
    }
    print “ 欢迎来到渣小狼的博客,这既是博客,也是日记,里面记录了小狼的学习经历还有一些小狼的见解,非常希望每一个来到这里的人能够留下只言片语,更加的希望留下的是对于小狼的不足的补充,谢谢(*^__^*) 嘻嘻……”
  • 相关阅读:
    移动自动化测试平台技术架构与智能设备选型
    自动遍历回归测试工具
    PO模式自动化测试用例与测试框架封装改造
    Appium自动化测试之IOS WebView和Safari
    微信小程序自动化测试
    Android Native和Hybrid两种架构采用Appium进行UI自动化
    JavaScript学习 Ⅶ
    JavaScript学习 Ⅵ (正则表达式)
    JavaScript学习 Ⅴ
    JavaScript学习 Ⅳ
  • 原文地址:https://www.cnblogs.com/wolf-yasen/p/6557729.html
Copyright © 2011-2022 走看看