Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 71 Solved: 62
约翰有N(1≤N≤50000)头牛,约翰的草地可以认为是一条直线.每只牛只喜欢在某个特定的范围内吃草.第i头牛喜欢在区间(Si,Ei)吃草,1≤Si<Ei≤1,000,000,00.
奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此约翰要保证任意
两头牛都不会共享他们喜欢吃草昀领域.如果奶牛i和奶牛J想要同时吃草,那么要满足:Si>=Ej或者Ei≤Sj.约翰想知道在同一时刻,最多可以有多少头奶牛同时吃草?
第1行:一个整数N.
第2到N+1行:第i+l行有两个整数Si,Ei.
一个整数,最多可以有多少头牛同时吃草.
5 2 4 1 12 4 5 7 10 7 8
3
第1,3,4共3只奶牛可以同时吃草,第1,3,5也可以.
题解:贪心水题一道= =。。。很明显对于同样的右界限区间,显然选范围最小的肯定没有错,于是只保留范围小的,然后排序,贪心水过。。。
1 /**************************************************************
2 Problem: 3410
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:212 ms
7 Memory:696 kb
8 ****************************************************************/
9
10 var
11 i,j,k,l,m,n,t:longint;
12 a:array[0..60000,1..2] of longint;
13 procedure swap(var x,y:longint);
14 var z:longint;
15 begin
16 z:=x;x:=y;y:=z;
17 end;
18 procedure sort(l,r:longint);
19 var i,j,x,y:longint;
20 begin
21 i:=l;j:=r;x:=a[(l+r) div 2,2];y:=a[(l+r) div 2,1];
22 repeat
23 while (a[i,2]<x) or ((a[i,2]=x) and (a[i,1]>y)) do inc(i);
24 while (a[j,2]>x) or ((a[j,2]=x) and (a[j,1]<y)) do dec(j);
25 if i<=j then
26 begin
27 swap(a[i,1],a[j,1]);
28 swap(a[i,2],a[j,2]);
29 inc(i);dec(j);
30 end;
31 until i>j;
32 if i<r then sort(i,r);
33 if l<j then sort(l,j);
34 end;
35 begin
36 readln(n);
37 for i:=1 to n do readln(a[i,1],a[i,2]);
38 sort(1,n);
39 a[0,1]:=0;a[0,2]:=0;
40 t:=0;l:=0;
41 for i:=1 to n do
42 if a[i,2]<>a[i-1,2] then
43 if a[i,1]>=t then
44 begin
45 t:=a[i,2];
46 inc(l);
47 end;
48 writeln(l);
49 readln;
50 end.