1664: [Usaco2006 Open]County Fair Events 参加节日庆祝
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 286 Solved: 207[][][]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
Sample Output
HINT
Source
就是先排个序然后就是递推一下吧,好像白书里面有贪心的算法但是翻了很久就是翻不到。。
----------------------------------------------------------------------------
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;const int nmax=10005;int f[nmax];struct edge{ int l,r; bool operator<(const edge&rhs) const { return l<rhs.l||l==rhs.l&&r<rhs.r;}};edge a[nmax];int main(){ int n; scanf("%d",&n); for(int i=1,o;i<=n;i++){ scanf("%d%d",&a[i].l,&o); a[i].r=a[i].l+o-1; } sort(a+1,a+n+1); for(int i=1;i<=n;i++){ f[i]=1; for(int j=1;j<i;j++){ if(a[i].l>a[j].r) f[i]=max(f[i],f[j]+1); } } printf("%d\n",f[n]); return 0;}
-------------------------------------------------------------------------------