找点

来源:互联网 发布:阴阳师御灵强化数据 编辑:程序博客网 时间:2024/04/28 03:07

描述

上数学课时,老师给了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

思路:

1.先对区间按照右边界从小到大排序
2.每次取区间的左边界最大值和右边界最小值,如果两个区间刚好相邻,取他们的相交点作为左右边界,只要每次新的区间的左边界不大于等于原来的右边界,取点总数都不用加1,否则加1
例如:
6
3 4
2 4
3 10
7 9
8 11
8 14
排序后是:
2 4
3 4
7 9
3 10
8 11
8 14
过程:sum=1;
首先,模板为[2,4],3,4加入, 比较左右点,更新为[3,4],此时依旧sum=1;
然后,模板为[3,4],7,9加入, 发现7>4,     此时更新左右边界为[7,9],sum+1=2;
然后,模板为[7,9],3,10加入,比较左右点,无需更新,此时依旧sum=2;
然后,模板为[7,9],8,11加入,比较左右点,更新为[8,9],此时依旧sum=2;
然后,模板为[8,9],8,14加入,比较左右点,不更新,此时sum依旧为2
最终答案便是2
#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

struct node

{

   int x,y;

}a[200];

int cmp(node a,node b)

{

return a.y<b.y;

}

int main()

{

    int i,j,n,m1,m2,sum,x;

    while(scanf("%d",&n)!=EOF)

    {

        for(i=0;i<n;i++)

         scanf("%d %d",&a[i].x,&a[i].y);

        sort(a,a+n,cmp);

        m1=a[0].x;m2=a[0].y;sum=1;x=0;

        for(i=1;i<n;i++)

        {

           if(a[i].x<m2&&a[i].x>m1)

           m1=a[i].x;

           else

           {

                  if(a[i].x==m2)

                  {

                     m1=a[i].x;

                     m2=a[i].x;

                  }

                  if(a[i].x>m2)

                  {

                      sum++;

                      m1=a[i].x;

                      m2=a[i].y;

                  }

           }

        }

        

        printf("%d\n",sum);

    }

    return 0;

}

0 0
原创粉丝点击