其他分享
首页 > 其他分享> > 用贪心解决的区间问题

用贪心解决的区间问题

作者:互联网

《区间选点》

 

 即一个点尽量在更多的区间上,但我们不妨从另一个方面想:在一个区间上的点,始终不能够与另一个区间有关系的情况是什么?

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 1e5 + 10;
 6 struct Section
 7 {
 8     int l, r;
 9 } arr[N];
10 int main()
11 {
12     int n;
13     cin >> n;
14     for (int i = 1; i <= n; i++)
15         cin >> arr[i].l >> arr[i].r;
16     sort(arr+1,arr+n+1,[](Section a,Section b){
17         return a.r<b.r;
18     });
19     int maxr=-2e9,ans=0;
20     for (int i=1;i<=n;i++)
21     {
22         if (maxr<arr[i].l)
23         {
24             ans++;
25             maxr=arr[i].r;
26         }
27     }
28     cout<<ans;
29     return 0;
30 }

《最大不相交区间数》

 

 即,选择出区间与区间之间互不相交的最大区间个数

 

 所以代码也与上面相同

《区间分组》

 

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 using namespace std;
 6 const int N = 1e5 + 10;
 7 int n;
 8 
 9 struct Section
10 {
11     int l, r;
12 } arr[N];
13 
14 int main()
15 {
16     int n;
17     cin >> n;
18     for (int i = 1; i <= n; i++)
19         cin >> arr[i].l >> arr[i].r;
20     sort(arr + 1, arr + n + 1, [](Section a, Section b)
21          { return a.l < b.l; });
22     priority_queue<int, vector<int>, greater<int>> q;
23     q.push(arr[1].r);
24     for (int i = 2; i <= n; i++)
25     {
26         int t = q.top();
27         if (arr[i].l > t)
28             q.pop();
29         q.push(arr[i].r);
30     }
31     cout<<q.size();
32     return 0;
33 }

《区间覆盖》

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 1e5 + 10;
 6 int s, t, n;
 7 struct Section
 8 {
 9     int l, r;
10 } arr[N];
11 int main()
12 {
13     cin >> s >> t >> n;
14     for (int i = 1; i <= n; i++)
15         cin >> arr[i].l >> arr[i].r;
16     sort(arr + 1, arr + n + 1, [](Section x, Section y)
17          { return x.l < y.l; });
18     int ans = 0;
19     bool flag = false;
20     for (int i = 1; i <= n; i++)
21     {
22         int maxr = -2e9, j = i;
23         if (arr[i].l > s)
24             break;
25         while (j <= n && arr[j].l <= s)
26         {
27             maxr = max(maxr, arr[j].r);
28             j++;
29         }
30         ans++;
31         s = maxr;
32         i = j - 1;
33         if (s >= t)//这个if判断语句还是挺有讲究的,因为flag在这里改变
34         {
35             flag = true;
36             break;
37         }
38     }
39     if (flag)
40         cout << ans;
41     else
42         cout << -1;
43     return 0;
44 }

 

标签:10,arr,int,Section,解决,区间,include,贪心
来源: https://www.cnblogs.com/cilinmengye/p/16542166.html