最大值最小化問題 和最小值最大化問題 ---(二分)


最大值最小化

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

總結:最大化最小化其實簡單來說就是二分查找,無非是條件不同,一個是滿足條件的最大的邊界,一個是滿足條件的最小的邊界。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM