小Q在进行一场竞技游戏,这场游戏的胜负关键就在于能否能争夺一条长度为L的河道,即可以看作是[0,L]的一条数轴。
这款竞技游戏当中有n个可以提供视野的道具−真视守卫,第i个真视守卫能够覆盖区间[xi,yi]。现在小Q想知道至少用几个真视守卫就可以覆盖整段河道。
输入包括n+1行。第一行包括两个正整数n和L(1<=n<=105,1<=L<=109)接下来的n行,每行两个正整数xi,yi(0<=xi<=yi<=109),表示第i个真视守卫覆盖的区间。
一个整数,表示最少需要的真视守卫数量, 如果无解, 输出-1。
4 6 3 6 2 4 0 2 4 7
3
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); int L=in.nextInt(); int[][] temp=new int[n][2]; for(int i=0;i<n;i++) { for(int j=0;j<2;j++) { temp[i][j]=in.nextInt(); } } //。获得了数组,进行排序 Arrays.sort(temp,new Comparator<int[]>() { public int compare(int[] o1, int[] o2) { return o1[0]==o2[0]?o1[1]-o2[1]:o1[0]-o2[0]; } }); int index=0; int count=0; int pre=0; //右边界 while(pre<L) { if(temp[index][0]>pre) { System.out.println(-1); } int max=0; while(index<n&&temp[index][0]<=pre) { max=Math.max(max, temp[index][1]); index++; } count++; pre=max; if(pre>=L) { System.out.println(count); return; } if(index>=n) { System.out.println(-1); return; } } } }Java贪心算法