版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugar_free_mint/article/details/82146245
题目
在一段区间里挑一些线段覆盖,使区间被完全覆盖,问需要多少条线段
分析
可以用贪心的方式每次跳过一些线段,所以要按起始点排序,之后就暴力了
代码
#include <cstdio>
#include <algorithm>
struct rec{
int a,b;
bool operator <(const rec &x)const{return a<x.a;}
}t[25001];
int n,m,ans;
int in(){
int ans=0; char c=getchar();
while (c<48||c>57) c=getchar();
while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
return ans;
}
int main(){
n=in(); m=in();
for (register int i=1;i<=n;i++) t[i]=(rec){in(),in()};
std::sort(t+1,t+1+n);
int now=0; bool flag=1;
for (register int i=1;i<=n;i++){
if (t[i].a>now+1) {flag=0; break;}//已经不可能覆盖了
int mx=t[i].a;
for (register int j=i;j<=n;j++){
if (t[j].a>now+1) break;//不可能跳过
mx=std::max(mx,t[j].b);//找到大的线段
i=j;//更新i(不用再跳了)
}
now=mx; ans++;//更新新的起始点
if (now>=m) break;//直接退出
}
if (flag&&now>=m) printf("%d",ans); else printf("-1");
return 0;
}