最大值最小化問題 和最小值最大化問題 ---(二分)
阿新 • • 發佈:2019-03-03
println 最大 最小 距離 方案 其中 第一個 pan lse
最大值最小化
即是當存在一個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); } }
總結:最大化最小化其實簡單來說就是二分查找,無非是條件不同,一個是滿足條件的最大的邊界,一個是滿足條件的最小的邊界。
最大值最小化問題 和最小值最大化問題 ---(二分)