• 找点


    第一部分:题目

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=891

    描述

    上数学课时,老师给了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
                                第二部分:思路
    对区间进行从小到大排序,当左端点一样时把右端点从小到大排序。排序后从头开始找到当前第一个有待找点的区间a,把a的左端点置为-1,表示这一次找到的点在a区间上。后续区间b与a能找到公共点的情况:1,左端点一致,那么肯定有公共点。2,a、b的左端点不一致,但b左端点小于等于当前区间a的右端点。这里需要注意:如果b的右端点小于a的右端点时,需要把a的右端点置为b的右端点。并且把b的左端点置为-1.
                                第三部分:代码
    #include<stdio.h>
    int main()
    {
        int n,s[100][2],i;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&s[i][0],&s[i][1]);
            }
            int j,t;
            for(i=0;i<n-1;i++)//从小到大排序
            {
                for(j=i+1;j<n;j++)
                {
                    if(s[i][0]>s[j][0]||s[i][0]==s[j][0]&&s[i][1]>s[j][1])//左端点一致时对右端点进行排序
                    {
                        t=s[i][0];
                        s[i][0]=s[j][0];
                        s[j][0]=t;
                        t=s[i][1];
                        s[i][1]=s[j][1];
                        s[j][1]=t;
                    }
                }
            }
            int count=0;
            for(i=0;i<n;i++)
            {
                if(s[i][0]!=-1)//左端点为-1,已经找到一个点位于该区间
                {
                    int temp=s[i][1];
                    s[i][0]=-1;//找到点了 
                    count++;
                    for(j=i+1;j<n;j++)
                    {
                        if(s[j][0]!=-1&&s[j][0]<=temp)
                        {
                            s[j][0]=-1;
                            if(temp>s[j][1])//注意,当后续区间在当前区间内部时,需要缩小范围
                            {
                                temp=s[j][1];
                            } 
                        } 
                    }
                }
            }
            printf("%d
    ",count);
        }
        return 0;
    }
  • 相关阅读:
    【原创】深入理解c++的右值引用
    【原创】c++拷贝初始化和直接初始化的底层区别
    【原创】Github团队协作之Pull请求
    【原创】基于多线程的银行家算法设计
    【原创】Git删除暂存区或版本库中的文件
    【笔记】程序员的思维修炼3
    【笔记】德雷福斯模型
    【原创】GC/垃圾回收简介
    数据库——JavaWEB数据库连接
    多线程
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5412827.html
Copyright © 2020-2023  润新知