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


    最大值最小化

    即是当存在一个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);
        }
    }

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

  • 相关阅读:
    springboot使用hibernate validator校验
    @Inherited:允许子类继承父类的注解。
    springboot跨域配置
    spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过
    spring boot(10) 基础学习内容
    关于Spring @RequestBody 自动映射模型原理
    @Requestbody@ApiParam @PathVariable @RequestParam三者区别
    《生成对抗网络入门指南【2】》
    《生成对抗网络入门指南【1】》
    《精通 CSS3 动画(学完这个课写炫酷页面)》
  • 原文地址:https://www.cnblogs.com/ls-pankong/p/10467287.html
Copyright © 2020-2023  润新知