P1873 砍树 (最大化最小值)
https://www.luogu.org/problem/P1873
直接二分 H H H 可能的的取值即可,最小从0开始,最大到1000000000,因为此处用的二分是左开右闭,所以 l = 0 , r = 1000000000 + 1 l=0,r=1000000000+1 l=0,r=1000000000+1
Java代码只能得 70分,其中有三个点内存爆了。
想全过,可以改成cpp代码,有些题对Java太不友好了。哎
此代码始终维持左闭右开 因为值越小,一定能够满足条件,相当于没有下限
/**
*ProrityQueue
*@author Hongchuan CAO
*/
import java.util.Scanner;
public class Main {
private static int[] height;
public static void main(String arg[]) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
height = new int[n];
for(int i=0;i<n;i++) height[i] = in.nextInt();
int l = 0, r = 1000000000+1;
while(l + 1 < r){
int mid = l + (r - l)/2;
if(checked(mid,m)){
l = mid;
}else {
r = mid;
}
}
System.out.println(l);
}
public static boolean checked(int mid, long m){
long sum = 0;
for(int xx : height){
if(xx - mid > 0) sum += (xx - mid);
}
return sum >= m;
}
}
The Frog’s Games (最小化最大值)
https://vjudge.net/problem/HDU-4004
此代码始终维持左开右闭,因为值越大,一定能够满足条件,相当于没有上限
/**
*HDU 4004
*@author Hongchuan CAO
*/
import java.util.Arrays;
import java.util.Scanner;
import java.util.logging.Logger;
public class Main {
static Logger logger = Logger.getLogger("main");
private static int[] dis;
public static void main(String arg[]) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int L = in.nextInt();
int n = in.nextInt();
int m = in.nextInt();
dis = new int[n+2];
for(int i=1;i<=n;i++){
dis[i] = in.nextInt();
}
dis[0] = 0;
dis[n+1] = L;
Arrays.sort(dis);
int l = 0; int r = L;
while(l + 1 < r){
int mid = l + (r - l) / 2;
if(checked(mid,m)){
r = mid;
}else{
l = mid;
}
}
System.out.println(r);
}
in.close();
}
public static boolean checked(int mid, int m){
int index = 0;
int start = 0;
for(int i=0;i<dis.length;i++){
if(dis[i] - start > mid){
if(i>=1&&dis[i] - dis[i-1] > mid) return false;
index++;
start = dis[i-1];
i--;
}
}
return index+1 <= m;
}
}