Week3 C - 区间覆盖

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;
	}
} 
发布了17 篇原创文章 · 获赞 0 · 访问量 210

猜你喜欢

转载自blog.csdn.net/qq_43324189/article/details/104979769
今日推荐