1664: [Usaco2006 Open]County Fair Events 参加节日庆祝

时间:2022-02-25 19:12:08

1664: [Usaco2006 Open]County Fair Events 参加节日庆祝

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 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

7
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

4

OUTPUT DETAILS:

FJ can do no better than to attend events 1, 2, 3, and 4.

HINT

 

Source

Silver

 

题解:一个考得烂了的贪心,很经典的最多不向交区间问题而已

 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.