「一本通 1.1 例 1」活动安排(贪心算法)题解
思路
贪心。
定义一个结构体 Node
,用于记录每个活动的信息。里面重载 <
运算符,用于排序。输入结束后根据 f[i]
的大小排序。
贪心算法的效率极高。当输入的活动已按结束时间的非减序排列,算法只需 O ( n ) O(n) O(n) 的时间安排 n n n 个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用 O ( n log n ) O(n\log n) O(nlogn) 的时间重排。
若被检查的活动 i i i 的开始时间 S i S_i Si 小于最近选择的活动 j j j 的结束时间 f i f_i fi,则不选择活动 i i i,否则选择活动 i i i 加入答案中。
贪心算法并不总能求得问题的整体最优解,但对于活动安排问题,贪心算法却总能求得整体最优解,即它最终所确定的相容内容活动的规模最大。这可以用数学归纳法证明。
Code
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int l, r;
int operator<(Node A)
{
return l < A.l | (l == A.l & r < A.r);
}
} p[2000];
int n, Q, C, i;
main()
{
cin >> n;
for (; i < n;)
cin >> p[i].l >> p[i++].r;
sort(p, p + n);
for (i = 0; i < n; i++)
if (C > p[i].l)
C = min(C, p[i].r);
else
Q++, C = p[i].r;
cout << Q;
}
广告
绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/
绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/
(现在使用,人人均可获得300元大奖)