描述 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 个节日每个节日有个开始时间, 及持续时间. 牛想尽可能多的参加节日, 问最多可以参加多少. 注意牛的转移速度是极快的, 不花时间.
输入格式 InputFormat
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.
输出格式 OutputFormat
Line 1: A single integer that is the maximum number of events FJ can attend.
样例输入 SampleInput
22
26 11
15 7
26 12
12 24
25 14
2 34
31 9
7 26
3 32
17 20
18 22
22 5
14 25
10 25
18 16
19 21
9 30
26 10
17 21
24 7
31 9
28 7
样例输出 SampleOutput
3
来源 Source
Silver
代码 Code
排序 + DP。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf=0x7fffffff;
struct event
{
int l,r;
bool operator < (const event &temp) const
{
return (l==temp.l)?r<temp.r:l<temp.l;
}
}a[10005];
int f[10005];
int i,j,t,n,m,k,z,y,x,ans;
inline void read(int &x)
{
x=0;char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
}
int main()
{
read(n);
for (i=1;i<=n;i++) read(a[i].l),read(x),a[i].r=a[i].l+x-1;
sort(a+1,a+n+1);
ans=0;
for (i=1;i<=n;i++)
{
f[i]=1;
for (j=1;j<i;j++) if (a[i].l>a[j].r) f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}