zoukankan      html  css  js  c++  java
  • nyoj 891 找点

    找点

    时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述

    上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?

    输入多组测试数据。
    每组数据先输入一个N,表示有N个闭区间(N≤100)。
    接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。 输出输出一个整数,表示最少需要找几个点。 样例输入

    4
    1 5
    2 4
    1 4
    2 3
    3
    1 2
    3 4
    5 6
    1
    2 2

    样例输出

    1
    3
    1

    此题为贪心区间取点问题,先将区间右端b按从小到大排序
    当b相等时将a按从大到小排序,这样则小区间在大区间上边;
    将第一个区间的右端b赋值给j,然后依次与以下区间的左端a比较
    若大于以下区间的左端a,则证明有公共区间,当j大于后边的区间
    左边a时,证明与以上区间无重合部分则 m++;左后输出m

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    struct record
    {
    	int beg;
    	int end;
    }num[101];
    bool cmp(record a,record b)   //排序  将区间右边按从小到大排序 
    {
    	if(a.end!=b.end)
    	return a.end<b.end;      //区间左边 在右边的基础上从大到小排序 
    	else
    	return a.beg>b.beg;
    }
    int main()
    {
    	int n,m,j,i,s,t;	
    	while(scanf("%d",&n)!=EOF)
    	{
    		j=0;
    	    for(i=0;i<n;i++)
    	    scanf("%d %d",&num[i].beg,&num[i].end);
    	    sort(num,num+n,cmp);
    		j=num[0].end;m=1;	    
    	    for(i=1;i<n;i++)       //当下一个区间的左边大于开始赋值的数 j 
    	    {	                    //则将此区间 的右边赋值给j 
    		    if(num[i].beg>j)
    		    {
    		    	j=num[i].end;     
    		    	m++;
    		    }
            }
            printf("%d
    ",m);
        }
    	return 0;
    }
    

      

  • 相关阅读:
    超过经理收入的员工
    搜索插入位置
    整数反转
    俩数之和
    tar 命令参数解释
    【记录】Transaction rolled back because it has been marked as rollback-only
    【转载】BIO、NIO、AIO
    【转载】JDK自带的log工具
    【转载】java8中的Calendar日期对象(LocalDateTime)
    【对象属性复制】BeanUtils.copyProperties(obj1, obj2);
  • 原文地址:https://www.cnblogs.com/tonghao/p/4374731.html
Copyright © 2011-2022 走看看