题目的意思就是给出很多线段,问最少几个线段能覆盖指定区域。
首先输入测试组数后,输入一个数字M ,(0,M)就是要覆盖目标区域,
然后输入很多线段的左右端点。
思路就是先把线段按左端点排序,然后选出左端点小于等于目标区域左端点的线段中,覆盖最大的。之后把目标区域左端点,变为所选线段的右端点,重复操作。
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100005;
struct node{
int l, r;
}p[N];
int c[N];
int n;
bool cmp(node a, node b){
return a.l < b.l;
}
int main(){
int T;
cin >> T;
while( T-- ){
int M;
cin >> M;
n = 0;
int l, r;
while(cin >> l >> r, l||r){
p[n].l = l;
p[n].r = r;
n++;
}
sort(p, p+n, cmp);
int cur = 0;
int num = 0;
while( cur < M ){
int m = cur;
for(int i = 0; i < n; i++){
if(p[i].l <= cur && p[i].r > m){
m = p[i].r;
c[num] = i;
}
if(p[i].l > cur) break;
}
if(cur == m){
num = 0;
break;
}
cur = m;
num++;
}
cout << num << endl;
for(int i = 0; i < num; i++)
cout << p[c[i]].l << " " << p[c[i]].r << endl;
if(T)
cout << endl;
}
return 0;
}