#343. CSP2019PJ-20
CSP2019PJ-20
- (完善程序)
(最小区间覆盖)给出 n 个区间,第 i 个区间的左右端点是 [ai,bi]。现在要在这些区间中选出若干个,使得区间 [0,m] 被所选区间的并覆盖(即每一个 0 ≤ i ≤ m 都在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。
输入第一行包含两个整数 n 和 m(1 ≤ n ≤ 5000,1 < m ≤ )。
接下来 n 行,每行两个整数 ai,bi(0 ≤ ai,bi ≤ m)。
提示:使用贪心法解决这个问题。先用 O()的时间复杂度排序,然后贪心选择这些区间。
试补全程序。
#include<iostream>
using namespace std;
const int MAXN = 5000;
int n, m;
struct segment { int a, b; } A[MAXN];
void sort()
{
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j++)
if(_________________________)
{
segment t = A[j];
_________________________
}
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i++)
cin >> A[i].a >> A[i].b;
sort();
int p = 1;
for(int i = 1; i < n; i++)
if(_________________________)
A[p++] = A[i];
n = p;
int ans = 0; r = 0;
int q = 0;
while( r < m)
{
while(_________________________)
q++;
_________________________
ans++;
}
cout << ans << endl;
return 0;
}
① 处应填( )。
{{ select(1) }}
- A[j].b < A[j - 1].b
- A[j].b > A[j - 1].b
- A[j].a < A[j - 1].a
- A[j].a > A[j - 1].a
② 处应填( )。
{{ select(2) }}
- A[j - 1] = A[j]; A[j] = t;
- A[j + 1] = A[j]; A[j] = t;
- A[j] = A[j - 1]; A[j - 1] = t;
- A[j] = A[j + 1]; A[j + 1] = t;
③ 处应填( )。
{{ select(3) }}
- A[i].b < A[p - 1].b
- A[i].b > A[i - 1].b
- A[i].b > A[p - 1].b
- A[i].b < A[i - 1].b
④ 处应填( )。
{{ select(4) }}
- q + 1 < n && A[q + 1].b <= r
- q + 1 < n && A[q + 1].a <= r
- q < n && A[q].a <= r
- q < n && A[q].b <= r
⑤ 处应填( )。
{{ select(5) }}
- r = max(r, A[q + 1].a)
- r = max(r, A[q].b)
- r = max(r, A[q + 1].b)
- q++
相关
在下列比赛中: