NYOJ891-找点

简介:

找点
时间限制: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

来源
原创

 

思路:
贪心算法
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
图:

 

 

 

AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
   int x,y;
}a[200];
int cmp(node a,node b)
{
    if(a.y!=b.y) 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;
        //printf("m1=%d m2=%d\n",m1,m2);
        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("m1=%d m2=%d\n",m1,m2);
        }
        
        printf("%d\n",sum);
    }
    return 0;
}
相关文章
|
API
NYOJ 540
  为了给学弟学妹讲课,我水了一道题…… import java.util.Arrays; import java.util.Scanner; public class NYOJ540 { public static void main(String[] args) { ...
806 0
|
计算机视觉
NYOJ 289
  苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
735 0
|
人工智能 测试技术
NYOJ&#160;79
拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于等于前一发的高度。
944 0
NYOJ 506
  洗澡 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Mostrp是个爱干净的好少年。 有一次去澡堂洗澡时发现 澡堂的澡柜编号中没有出现过数字‘4’。
800 0
NYOJ 283
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 /* 9 bool cmp(char *a,char *b) 10...
473 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
664 0
NYOJ 93
  汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
579 0
NYOJ 19
  擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。
740 0
|
人工智能
NYOJ 55
  懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 小明很想吃果子,正好果园果子熟了。在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
934 0