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

最大值最小化

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

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

猜你喜欢

转载自www.cnblogs.com/ls-pankong/p/10467287.html