1664: [Usaco2006 Open]County Fair Events 参加节日庆祝
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 255 Solved: 185
[Submit][Status][Discuss]
Description
Farmer John has returned to the County Fair so he can attend the special events (concerts, rodeos, cooking shows, etc.). He wants to attend as many of the N (1 <= N <= 10,000) special events as he possibly can. He's rented a bicycle so he can speed from one event to the next in absolutely no time at all (0 time units to go from one event to the next!). Given a list of the events that FJ might wish to attend, with their start times (1 <= T <= 100,000) and their durations (1 <= L <= 100,000), determine the maximum number of events that FJ can attend. FJ never leaves an event early.
有N个节日每个节日有个开始时间,及持续时间. 牛想尽可能多的参加节日,问最多可以参加多少. 注意牛的转移速度是极快的,不花时间.
Input
* Line 1: A single integer, N.
* Lines 2..N+1: Each line contains two space-separated integers, T and L, that describe an event that FJ might attend.
Output
* Line 1: A single integer that is the maximum number of events FJ can attend.
Sample Input
1 6
8 6
14 5
19 2
1 8
18 3
10 6
INPUT DETAILS:
Graphic picture of the schedule:
11111111112
12345678901234567890---------这个是时间轴.
--------------------
111111 2222223333344
55555555 777777 666
这个图中1代表第一个节日从1开始,持续6个时间,直到6.
Sample Output
OUTPUT DETAILS:
FJ can do no better than to attend events 1, 2, 3, and 4.
HINT
Source
题解:一个考得烂了的贪心,很经典的最多不向交区间问题而已
1 /************************************************************** 2 Problem: 1664 3 User: HansBug 4 Language: Pascal 5 Result: Accepted 6 Time:28 ms 7 Memory:1008 kb 8 ****************************************************************/ 9 10 var 11 i,j,k,l,m,n:longint; 12 a:array[0..100005,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 for i:=1 to n do a[i,2]:=a[i,1]+a[i,2]-1; 39 sort(1,n);l:=0; 40 for i:=1 to n do if a[i,1]<>a[l,1] then 41 begin 42 inc(l); 43 a[l,1]:=a[i,1]; 44 a[l,2]:=a[i,2]; 45 end; 46 n:=l;l:=0;k:=0; 47 for i:=1 to n do 48 if a[i,1]>l then 49 begin 50 inc(k); 51 l:=a[i,2]; 52 end; 53 writeln(k); 54 readln; 55 end.