最大值最小化问题 和最小值最大化问题 ---(二分)

最大值最小化

即是当存在一个x为最大值的最小化,则x-1不成立,x+1可行,但他不满足最小,所以设边界最小值L,最大值R,二分查找第一个满足题意的,

例子:

把一个包含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,不是最小。

public class Main98 {

     public static boolean p(int x,int []a,int n,int m){
         int ans =1,sum=0;
         for(int i=0;i<n;i++){
             sum+=a[i];
             if(sum>x){
                 sum=a[i];
                 ans++;
             }
         }
         if(ans>m)
             return true;
         else
             return false;
     }

    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         int  n = sc.nextInt();
          int  m = sc.nextInt();
        int[] a = new int[n];
        int x = 0;
         int min = 0,max = 10000;
         for(int i=0;i<n;i++){
             a[i] = sc.nextInt();
             min= x>a[i]?x:a[i];
         }

         while(min<max){
              x = min+(max-min)/2;
             if(p(x,a,n,m))
                 min=x+1;
             else
                 max=x;

         }
         System.out.println(min);
    }

}

最小值最大化

即是当存在一个x为最小值的最大化,则x+1不成立,x-1可行,但他不满足最大,所以设边界最小值L,最大值R,二分查找第一个满足题意的,

例子:

农民有用C只牛,然后他有N个隔间,每个隔间都有自己的坐标位置(一维的)pos,如何安排把牛安排进隔间才能使,所有牛之间距离的最小值最大,我们不需要求这个分配方案,我们只需要求这个最小距离的最大值,很裸的最小值最大化。

public class Main98{
    static int a[],n, m;
    public static boolean ok(int mid){
        int cnt=1;
        int tmp=a[0];
        for(int i=1;i<n;i++){
            if(a[i]-tmp>=mid){
                cnt++;
                tmp=a[i];
                if(cnt>=m)
                    return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         n= sc.nextInt();
         m = sc.nextInt();
         a= new int[n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
        Arrays.sort(a);
        int l=0,r=a[n-1];
            int mid;
            while(l<r){
                mid=l+(r-l)/2;
                if(ok(mid)){
                    l=m+1;
                }else
                    r=m;
            }
            System.out.println(r);
    }
}

总结:最大化最小化其实简单来说就是二分查找,无非是条件不同,一个是满足条件的最大的边界,一个是满足条件的最小的边界。

原文地址:https://www.cnblogs.com/ls-pankong/p/10467287.html

时间: 2024-11-05 06:04:39

最大值最小化问题 和最小值最大化问题 ---(二分)的相关文章

uva 714 - Copying Books(贪心 最大值最小化 二分)

题目描述开头一大堆屁话,我还仔细看了半天..其实就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,如果最小值相同情况下有多种分配方案,输出前面份数小的,就像字典序输出从小到大一样的意思. 这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值.如何确定这个x就是用的二分法,x一定大于0小于所有值的合,不断的二分再判断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失

BUAA1389愤怒的DZY(最大值最小化)

http://acm.buaa.edu.cn/problem/1389/ 愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游戏是这样的:玩家有K个DZY,和N个位于不同的整数位置:X1,X2,…,XN的干草包.每一个DZY都可以站在某个位置:X 扔炸弹,扔完炸弹,这个DZY就会挂掉.扔炸弹的半径为R(且每次每个DZY扔炸弹的半径不变,都是R,而站的位置X可以改变),破坏范围为的X−R~X+R(即位置在X-R到X+R(含X

UVa 714 Copying books 贪心+二分 最大值最小化

题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相同的,求所有书抄完所用的最少时间的分配方案. 题目中的要求是去求划分的子序列的最大值尽量小,最大值最小化,如果从划分的角度看,无法获得好的思路,我们可以从值得角度考虑,所要求的最小的最大值必定是从[amax,sum(总和)]中取得的,那么我们可以二分法的方式猜测一个数字,看它是否满足要求,如果满足要求,我们可

UVA714- Copying Books(最大值最小化)

题意:k份书稿分成m份,使得每份的和最小 思路:典型最大值最小化问题,使用贪心+二分.贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x. 因为输出的原因,在划分时就从后往前尽量划分. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long l

uva714 - Copying Books(最大值最小化)

题目:uva714 - Copying Books(最大值最小化) 题目大意:给出n本书,每本书的值代表这本书的页数.然后给定m个scribers,每个scriber至少要抄一本书,或者连续的几本书.每个scriber的工作量就等于他要抄的书的页数之和.问怎样划分能使的scribers中工作量的最大值最小.这里要求答案如果有多种的话就输出前面的和比较小的那个划分. 解题思路:最大值最小化问题. 二分尝试可能的最大值,然后如果在这个最大值的情况下可以划分的话,说明最大值可能是这个值,也可能更小.如

Crowd Control(输出不在最大值最小化的最短路上的边)

题意: 就是求完最大值最小化  然后输出在这条最大值最小化的最短路上的点的不在最短路上的边,emm.... 解析: 很明显,先套spfa最大值最小化模板,emm... 在更新d的时候 用一个pre去记录父结点 跑完spfa后用dfs把这条最短路上所有经过的点找出来 放在vector里,用数组也行,这不是好用嘛..emm.. 然后在跑一次dfs(其实两个循环就能解决..我怕超时..所以用了dfs..然而可能没啥区别..不会算复杂度的我瑟瑟发抖) 遍历这些点  在遍历每个点的同时去遍历所有的边 找出

最小值最大化,最大值最小化

问题描述把一个包含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,不是最小. 每次划分后,所有的序列的S[i]求出来,选择其中的最大值 每一种划分,都对应着一个最大的S[i] 求一种划分方法,使得S[i]的最大

poj Monthly Expense(最大值最小化)

Monthly Expense 题目链接:Click Here~ 题目分析: 给出N个数,要求你合并连续的数,使其合并在满足不差过M个合并后的集合的时候,不超过M个集合的和的最大值最小. 思路分析: 1.二分集合的和的最小值. 2.C:判断是否满足集合不超过M个? #include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAXN = 100000

最大值最小化问题

问题描述: 把一个包含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,不是最小. 问题分析: 能否使m个连续子序列所有的s(i)均不超过x,则该命题成立的最小的x即为答案.该命题不难判断,只需贪心,每次尽量从左 向右尽量