hihocoder-Weekly223-Interval Coverage

hihocoder-Weekly223-Interval Coverage

 

题目1 : Interval Coverage

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

You are given N intervals [S1, T1], [S2, T2], [S3, T3], ... [SN, TN] and a range [X, Y]. Select minimum number of intervals to cover range [X, Y].

输入

The first line contains 3 integers N, X and Y. (1 <= N <= 100000, 1 <= X < Y <= 1000000)

The following N lines each contain 2 integers Si, Ti denoting an interval. (1 <= Si < Ti <= 1000000)

输出

Output the minimum number of intevals to cover range [X, Y] or -1 if it is impossible.

样例输入
5 1 5
1 2    
1 3  
2 4  
3 5  
4 5 
样例输出
2

 

 

  题解:

    参考:http://hihocoder.com/discuss/question/5567

    使用贪心算法。对所有的interval上的排序之后,根据interval进行尽可能向后的选择。

 

 

#include <cstdio>  
#include <cstring> 
#include <cstdlib>   

const int MAXN = 100000 + 10; 

struct Node
{
	int x, y; 
}nd[MAXN]; 
int n, x, y; 

#define max(a, b) (a)>(b)?(a):(b) 

int cmp(const void *a, const void *b)
{
	Node *aa = (Node *)a; 
	Node *bb = (Node *)b; 
	if(aa->x == bb->x)
	{
		return (aa->y - bb->y); 
	}
	return aa->x - bb->x; 
}

int main(){ 

    scanf("%d %d %d", &n, &x, &y);   

    int max_y = 0;  
    for(int i=0; i<n; ++i)
    {
    	scanf("%d %d", &nd[i].x, &nd[i].y); 
    	max_y = max(max_y, nd[i].y);  
    } 
    qsort(nd, n, sizeof(Node), cmp);  

    if(n <= 0 || nd[0].x > x || max_y < y)
    {
    	printf("-1\n");
    }else{
    	int tmp_y=0, cnt = 1, start = x, end = 0; 
    	for(int i=0; i<n; ++i)
    	{
    		if(nd[i].y < start)
    		{
    			continue; 
    		} 
    		if(nd[i].x <= start)
    		{
    			tmp_y = max(tmp_y, nd[i].y);   
    		}else if(nd[i].x > end)
    		{
    			break; 
    		}else{
    			start = tmp_y;  
    			tmp_y = nd[i].y; 
    			++cnt; 
    		}
    		end = max(end, nd[i].y); 
    		if(end >= y)
    		{
    			break; 
    		}
    	}
    	if(end >= y)
    	{
    		printf("%d\n", cnt);
    	}else{
    		printf("-1\n");
    	} 
    } 
    return 0; 
} 

 

posted @ 2018-10-13 15:02  zhang--yd  阅读(216)  评论(0编辑  收藏  举报