BZOJ 3433 [Usaco2014 Jan]Recording the Moolympics:贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3433

题意:

  给出n个区间[a,b)。

  有两个记录器,每个记录器中存放的区间不能重叠。

  求两个记录器中最多可放多少个区间。

 

题解:

  贪心。

 

  先按右端点从小到大排序。

  p1,p2分别为两个记录器的最右端。

 

  始终令p1 < p2(避免出现大材小用)。

  对于每个区间s:

    if p1 <= s.l,则将s放入p1所在记录器。即:p1 = s.r, ans++;

    else if p2 <= s.l,则将s放入p1所在记录器。即:p2 = s.r, ans++;

    else 那就没法放了...

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 #define MAX_N 155
 6 #define INF 1000000000
 7 
 8 using namespace std;
 9 
10 struct Sec
11 {
12     int l;
13     int r;
14     Sec(int _l,int _r)
15     {
16         l=_l;
17         r=_r;
18     }
19     Sec(){}
20     friend bool operator < (const Sec &a,const Sec &b)
21     {
22         return a.r!=b.r?a.r<b.r:a.l<b.l;
23     }
24 };
25 
26 int n;
27 int ans=0;
28 Sec s[MAX_N];
29 
30 void read()
31 {
32     cin>>n;
33     for(int i=0;i<n;i++)
34     {
35         cin>>s[i].l>>s[i].r;
36     }
37 }
38 
39 void solve()
40 {
41     sort(s,s+n);
42     int p1=-INF;
43     int p2=-INF;
44     for(int i=0;i<n;i++)
45     {
46         if(p1<p2) swap(p1,p2);
47         if(p1<=s[i].l)
48         {
49             ans++;
50             p1=s[i].r;
51         }
52         else if(p2<=s[i].l)
53         {
54             ans++;
55             p2=s[i].r;
56         }
57     }
58 }
59 
60 void print()
61 {
62     cout<<ans<<endl;
63 }
64 
65 int main()
66 {
67     read();
68     solve();
69     print();
70 }

 

posted @ 2017-10-17 23:30  Leohh  阅读(511)  评论(0编辑  收藏  举报