最大值最小化
即是当存在一个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