zoukankan      html  css  js  c++  java
  • 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
    ");
        }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
    ", cnt);
        	}else{
        		printf("-1
    ");
        	} 
        } 
        return 0; 
    } 
    
  • 相关阅读:
    解决ArrayList线程不安全
    TraceView工具的使用
    Service
    Android之移动热修复
    06 swap命令,进程管理,rmp命令与yum命令,源码安装python
    04 linux用户群组和权限
    03 linux命令的操作
    Unity 5.x 导入教学Demo
    Creo二次开发—内存处理
    求一个数的二进制数中所含1的个数的代码实现
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/9782941.html
Copyright © 2011-2022 走看看