[Usaco2006 Open]County Fair Events 參加節日慶祝
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
Sample Output
4
首先按結束時間排序,然後一路搜下去,發現一個節日的開始時間在所記錄的結束時間之後,就參加這個節日,同時更新記錄的結束時間(典型貪心思想)
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define inf 0x7f7f7f typedef long long ll; typedef unsigned int ui; typedef unsigned long long ull; using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); for (;ch<‘0‘||ch>‘9‘;ch=getchar()) if (ch==‘-‘) f=-1; for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=(x<<3)+(x<<1)+ch-‘0‘; return x*f; } inline void print(int x){ if (x>=10) print(x/10); putchar(x%10+‘0‘); } const int N=1e4; struct AC{ int l,r; void join(int x,int y){l=x,r=y;} bool operator <(const AC &x)const{return r<x.r;} }A[N+10]; int main(){ int n=read(); for (int i=1,x,y;i<=n;i++) x=read(),y=read(),A[i].join(x,x+y); sort(A+1,A+1+n); int x=A[1].r,ans=1; for (int i=2;i<=n;i++) if (A[i].l>=x) x=A[i].r,ans++; printf("%d\n",ans); return 0; }
[Usaco2006 Open]County Fair Events 參加節日慶祝