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

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.

 

转载于:https://www.cnblogs.com/HansBug/p/4478053.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值