题意:用已有的区间去覆盖[1,10000]这个大区间,求移动步数中移动最大的距离
AC代码(感觉应该有过不去的样例,但是给的样例都过了):
package 蓝桥杯2017;
import java.util.*;
public class 区间移位 {
static Scanner sc=new Scanner(System.in);
static int n;
static List<Node>a=new ArrayList<>();
public static void main(String[] args) {
n=sc.nextInt();
for(int i=0;i<n;i++) {
a.add(new Node(sc.nextInt()*2,sc.nextInt()*2));
}
Collections.sort(a,new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
if (o1.r!=o2.r) {
return o1.r > o2.r ? 1 : -1;
}else {
return o1.l < o2.l ? -1 : 1;
}
}
});
int l=0;
int r=20000;
while(l<r) {
int mid=(l+r)/2;
if(check(mid)) {
r=mid;
}else {
l=mid+1;
}
}
if(l%2==0) {
System.out.println(l/2);
}else {
System.out.println(l*0.5);
}
}
static boolean check(int mid) {
List<Node>temp=new ArrayList<>(a);
int k = 0;
while (true) {
boolean flag = false;
for (int i = 0; i < temp.size(); i++) {
int start = temp.get(i).l;//区间开始
int end = temp.get(i).r;//区间结束
if (start - mid <= k && end + mid >= k) {//判断该区间是否可以连接到当前的k上
if (start + mid >= k) k += end - start;//
else k = end + mid;
temp.remove(i);
flag = true;
break;
}
}
if (!flag || k >= 20000) break;
}
return k >= 20000;
}
static class Node{
int l;
int r;
public Node(int l, int r) {
this.l = l;
this.r = r;
}
}
}