zoukankan      html  css  js  c++  java
  • Openjudge NOI题库 ch0406/2704 寻找平面上的极大点

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;
    用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。
    给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。
    编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。
    本题规定:n不超过100,并且不考虑点的坐标为负数的情况。
    输入
    输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。
    输出
    x轴坐标最小到大的顺序输出所有极大点。
    输出格式为:(x1,y1),(x2,y2),...(xk,yk)
    注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错

    这题其实很好处理,WR主要是测试数据忘了删= =

    先贴代码:

     1 #include <stdio.h>
     2 #include <stdlib.h> 
     3 struct point{
     4     int x;
     5     int y;
     6 };
     7 struct point s[101],save[101];
     8 int saveNum=0;//saveNum=当前栈元素个数
     9 int cmd(const void *a,const void *b)
    10 {
    11     return (*(struct point *)a).x-(*(struct point *)b).x;
    12 }
    13 void replace(struct point a)
    14 {
    15     save[saveNum-2]=a;
    16     saveNum--; 
    17 }
    18 int main()
    19 {
    20     int n,i,j;  
    21     scanf("%d",&n);
    22     for(i=0;i<n;i++)
    23         scanf("%d%d",&s[i].x,&s[i].y);
    24     qsort(s,n,sizeof(struct point),cmd);
    25     for(i=0;i<n;i++)
    26     {
    27         save[saveNum]=s[i]; 
    28         saveNum++;//预入栈 
    29         while(((saveNum-1)!=0)&&s[i].y>=save[saveNum-2].y)//把自己能统治的点都要了 
    30             replace(s[i]);
    31         if(((saveNum-1)!=0)&&save[saveNum-2].x==s[i].x&&save[saveNum-2].y>=s[i].y)//排除y相等的点 
    32             saveNum--;
    33     }
    34     if(saveNum>0)
    35     {
    36         printf("(%d,%d)",save[0].x,save[0].y);
    37         for(i=1;i<saveNum;i++)
    38             printf(",(%d,%d)",save[i].x,save[i].y);
    39     }
    40     return 0;
    41 }

    第一步先输入点,结构体储存,没什么好说的

    第二步按x来qsort,方便等会的比较和输出

    第三步开始逐个处理点,算法是这样的:

      1.把这个点先入栈,更新栈的元素个数

      2.看看现在是不是栈的唯一一点

        2.1是的话,就不进行操作,开始处理下一个点

        2.2不是的话,一直往前比较,遇到y比自己小的就把小点出栈(把当前点赋值到小点位置)

      3.有可能遇到同x但是y比较小的点,那就直接出栈(把栈的元素个数-1)

    第四步输出

    因为x已经按从小到大排了,那么当一个点入栈只会有两种情况:

    1.比上一个点的y大(包括等于) 这个情况包括了同x

    2.与上一个点同x但y较小

    处于上一个点内部统治区的情况是不可能存在的,分别处理以上两种情况即可AC

  • 相关阅读:
    linux 查看磁盘空间大小
    Redis内存碎片率
    redis的incr和incrby命令
    redis如何清空当前缓存和所有缓存
    ArcGIS矢量数据批量合并工具
    arcgis 获得工具有多少个
    GoogleEarth二次开发难点和技巧
    ArcGIS 智能批量赋高程工具
    arcgis python支持汉字
    ArcGIS 宗地图批量打印输出
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4905839.html
Copyright © 2011-2022 走看看