Week3 C - 区间覆盖
数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1
输入
第一行:N和T
第二行至N+1行: 每一行一个闭区间。
输出
选择的区间的数目,不可能办到输出-1
Input
3 10
1 7
3 6
6 10
Output
2
提示
这道题输入数据很多,请用scanf而不是cin
解题思路
先 sort 再说 排序对了对一半
先用头判断 可确保1出现在第一个
在用尾端判断 确保10在最后
Code
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
using namespace std;
struct node{
int x;//头
int y;//尾端
}no[25000];
bool cmp(node a,node b){
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
int main(){
int n,t;
//node ;
while(scanf("%d%d",&n,&t)!=EOF){
int a1,a2;
for(int i=0;i<n;i++){
scanf("%d %d",&no[i].x,&no[i].y);//记得要用scanf
}
sort(no,no+n,cmp);
int tmp;
int ans=0,l=0,j,lm;
int be=1;//记录上一个记录下的区间段的尾端
int i=0;//记录当前遍历到的区段
if(no[0].x!=1){cout<<-1<<endl;goto s1;//如果第一个的头不是 1 就直接结束
}
while(l<t-1){//循环直到累加 l 的长度达到目标 t
lm=0;
for(i;i<n;i++){
if(no[i].x<=be+1){
//当前区段的头小于上段的尾端+1([1,3][4,10])符合条件 判断时3+1跟4比较
tmp=no[i].y-be;//增加的长度
if(tmp>lm){//记录增加最多的一段
lm=tmp;
j=i;
}
}
if(no[i].x>be){//没有相连 断掉了
break;
}
}
if(lm==0){//新增的长度为0 下去
cout<<-1<<endl;
goto s1;
}
ans++;//记录有几段累加了
l+=lm;
be=no[j].y;//记录当前区段的尾端
}
cout<<ans<<endl;
s1:lm=0;
}
}