• 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 “ 欢迎来到渣小狼的博客,这既是博客,也是日记,里面记录了小狼的学习经历还有一些小狼的见解,非常希望每一个来到这里的人能够留下只言片语,更加的希望留下的是对于小狼的不足的补充,谢谢(*^__^*) 嘻嘻……”
  • 相关阅读:
    Linux内核的异常修复原理
    sudo: insmod: command not found
    在Qemu+ARM上运行Minix3内核
    2021.34 面对干扰
    2021.33 实践
    selenium+python自动化106
    python测试开发django-111.模型管理器(models.Manager)
    python笔记64
    python笔记63
    python笔记62
  • 原文地址:https://www.cnblogs.com/wolf-yasen/p/6557729.html
Copyright © 2020-2023  润新知