编程语言:Java
题目链接:http://poj.org/problem?id=2376
题解:这道题不难,但是我最初的解法有很多冗余的操作,导致时间会比现在的解法多一倍;其中没有搞懂的一点就是为什么当temp==0的时候,直接break会比i++(继续循环)更慢,很难理解。
结果:AC
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) throws IOException {
in.nextToken();
int n = (int) in.nval;
in.nextToken();
int t = (int) in.nval;
cow[] a = new cow[n];
for (int i = 0; i < n; i++) {
in.nextToken();
int s = (int) in.nval;
in.nextToken();
int e = (int) in.nval;
a[i] = new cow(s, e);
}
Arrays.sort(a, new Comparator<cow>() {
@Override
public int compare(cow o1, cow o2) {
if (o1.start != o2.start)
return o1.start - o2.start;
else
return o2.end - o1.end;
}
});
if (a[0].start != 1)
out.println("-1");
else {
cow c = a[0];
int res = 1;
int i = 0;
while (i < n) {
int j = i + 1;
int temp = 0;
for (; j < n; j++) {
//由于是按起始时间升序排列,所以当某只奶牛的初始时间高于上一个截止时间时就可以退出循环了
if (a[j].start > c.end + 1)
break;
else if (a[j].end > c.end) {
if (a[j].end > a[temp].end)
temp = j;
}
}
if (temp == 0)
i++;
//这里也可以直接break,但是不知道为什么会比这个继续循环慢一点
else {
i = temp;
res++;
c = a[temp];
}
}
if (c.end<t)
out.println("-1");
else
out.println(res);
}
out.flush();
}
}
class cow {
int start;
int end;
public cow(int start, int end) {
this.start = start;
this.end = end;
}
}