5945: 区间覆盖问题
数轴上有N个闭区间[Ai, Bi],选择尽量少的区间覆盖一条指定线段[S, T]。
输入
第一行为包含三个整数N(1 <= N <=10^5),S和T(-10^6 <= S < T <= 10^6)
接下来N行,每行2个整数Ai,Bi(-10^6 <= Ai < Bi < 10^6)
输出
输出包含一个整数,表示最少需要的区间的个数。如果无解,输出 No Solution
样例输入
8 1 10
-3 -1
13 16
0 3
2 6
3 5
6 10
5 6
4 10
样例输出
3
对输入输入的数据按照左端点进行排序初始化基准点为需要覆盖区间左端点寻找左端点比基准点小的且右端点比基准点大的区间在这些区间里面寻找右端点最大的更新基准点
#include <bits/stdc++.h> using namespace std; struct jilu { int l,r; }a[100010]; bool cmp(jilu a,jilu b) { return a.l<b.l; } int main() { int n,s,t,sum=0,f=1; cin>>n>>s>>t; for(int i=0;i<n;i++) { cin>>a[i].l>>a[i].r; } sort(a,a+n,cmp); int jidian=s,maxrl=-0x3f3f3f3f3f3f,f1=0;//这个maxrl挺坑的刚开始设了0WA了两次.. for(int i=0;i<n;i++) { if(jidian>=t) break; if(a[i].l<=jidian&&a[i].r>jidian) { maxrl=max(maxrl,a[i].r); f1=1; } if(a[i].l>jidian&&f1==0) { break; f=0; } else if(a[i].l>jidian&&f1==1) { sum++; jidian=maxrl; i--; maxrl=-0x3f3f3f3f3f3f; f1=0; } else if(i==n-1)//退出时需要更新 { sum++; jidian=maxrl; } } if(f!=0&&jidian>=t) cout<<sum<<endl; else cout<<"No Solution"<<endl; }