1. 程式人生 > >UVA - 10020 Minimal coverage(最小覆蓋)

UVA - 10020 Minimal coverage(最小覆蓋)

題目連結:
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; }

參考自:
https://blog.csdn.net/wss_ang/article/details/77513382