bzoj 1664 (貪心)
[Usaco2006 Open]County Fair Events 參加節日慶祝
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 487 Solved: 344
[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
71 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這裏很容易貪心證明,不需要去O(n^2)去跑,很容易被卡。
就是這裏的,想象成許多線段,如果相交,若當前線段右端比以前線段右端小,那麽就賦值為現在那條線段,因為這樣只會更優。
如果不想交,直接ans+1
劃水
1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define N 10007 8 using namespace std; 9 inline int read() 10 { 11 int x=0,f=1;char ch=getchar(); 12 while(ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();} 13 while(ch<=‘9‘&&ch>=‘0‘) 14 { 15 x=(x<<3)+(x<<1)+ch-‘0‘; 16 ch=getchar(); 17 } 18 return x*f; 19 } 20 21 int n,ans; 22 struct Node 23 { 24 int x,y; 25 }a[N]; 26 27 bool cmp(Node x,Node y) 28 { 29 return x.x<y.x; 30 } 31 int main() 32 { 33 n=read(); 34 for (int i=1;i<=n;a[i].x=read(),a[i].y=a[i].x+read()-1,i++); 35 sort(a+1,a+n+1,cmp); 36 37 for (int i=1,r=0;i<=n;i++) 38 { 39 if (a[i].x>r) ans++,r=a[i].y; 40 else if (a[i].y<r) r=a[i].y; 41 } 42 printf("%d",ans); 43 }
bzoj 1664 (貪心)