题目描述
曹操平定北方以后,公元 208 年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。
孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。
隆冬的十一月,天气突然回暖,刮起了东南风。
没想到东吴船队离开北岸大约二里距离,前面十条大船突然同时起火。火借风势,风助火威。十条火船,好比十条火龙一样,闯进曹军水寨。那里的船舰,都挤在一起,又躲不开,很快地都烧起来。一眨眼工夫,已经烧成一片火海。
曹操气急败坏的把你找来,要你钻入火海把连环线上着火的船只的长度统计出来!
输入格式
第一行一个整数 N。
以后 N 行,每行两个数:Ai,Bi
,表示连环线上着火船只的起始位置和终点。
输出格式
输出着火船只的总长度。保证答案在 32 位带符号整数的表示范围内。
输入输出样例
输入 #1
3
-1 1
5 11
2 9
输出 #1
11
import java.util.*;
public class Main {
public static void main(String[] args) {
new Main().sf();
}
int n = 0;
long[] a = new long[20005];
long x = 0, y = 0, z = 0, t = 0;
List<Student> students = new ArrayList<Student>();
public void sf() {
Scanner in = new Scanner(System.in);
n = in.nextInt();
for (int i = 1; i <= n; i++) {
students.add(new Student(in.nextInt(), in.nextInt()));
}
Collections.sort(students);
int qi = students.get(0).q;
int zh = students.get(0).z;
for (int i = 1; i < n; i++) {
if (students.get(i).q > zh) {
t += zh - qi;
qi = students.get(i).q;
zh = students.get(i).z;
} else {
zh = Math.max(zh, students.get(i).z);
}
}
/* 这个也可以
for (Student ss : students) {
if (ss.q > zh) {
t += zh - qi;
qi = ss.q;
zh = ss.z;
} else {
zh = Math.max(zh, ss.z);
}
}
*/
System.out.println(t + zh - qi);
}
}
class Student implements Comparable<Student>{
int q = 0;
int z = 0;
public Student(int q, int z) {
// TODO Auto-generated constructor stub
this.q = q;
this.z = z;
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return q - o.q;
}
}
以前做过一个差不多的,数据没这么大, ,方法就是每次加上可能是负数是绝对值,然后,在数组里面标记,这次这个,还是用这个方法吧,思路可以