UVA - 10020 Minimal coverage(最小覆蓋)
阿新 • • 發佈:2018-12-11
題目連結:
UVA - 10020 Minimal coverage
思路:
按左端點升序,每次遍歷固定左端點,更新右端點;
在一輪遍歷完成後,更新左端點的值,如果左端點大於題目設定的右端點則退出。
特殊情況:如果排序之後第一個區間的左端點大於目標區間的左端點,則直接退出,因為後面區間的左端點更是大於目標區間的左端點。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
int l,r;
}num[100010];
vector<node> v;
bool cmp(const node &a,const node &b){
return a.l<b.l;
}
int main(int argc, char** argv) {
int Case;
scanf("%d",&Case);
getchar();//換行
getchar();//空行
while(Case--){
v.clear();
int s=0,t,cnt=0;
scanf("%d",&t);
int x,y;
while(scanf("%d %d" ,&x,&y)!=EOF){
if(x==0&&y==0) break;
num[cnt].l=x;
num[cnt].r=y;
cnt++;
}
sort(num,num+cnt,cmp);
if(num[0].l>s){
printf("0\n");
}else{
int ind=0,flag=0;
while(s<t){
int idx=-1,right=s;
for(int i=0;i<cnt;i++){
if(num[i].l<=s&&num[ i].r>right){//固定左端點,更新右端點
right=num[i].r;
idx=i;
}
}
if(right!=s){
node num_tmp;
num_tmp.l=num[idx].l;num_tmp.r=num[idx].r;
v.push_back(num_tmp);
s=right;
}else{
printf("0\n");
flag=1;
break;
}
}
if(!flag){
printf("%d\n",v.size());
for(int i=0;i<v.size();i++){
printf("%d %d\n",v[i].l,v[i].r);
}
}
}
if(Case) printf("\n");
}
return 0;
}