找点

第一部分:题目

题目链接: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\n",count);
    }
    return 0;
}

 

posted @ 2016-04-20 15:16  喝醉的香锅锅  阅读(350)  评论(0编辑  收藏  举报