码迷,mamicode.com
首页 > 其他好文 > 详细

NOI题库 2704:寻找平面上的极大点

时间:2015-10-24 17:18:43      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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

 

NOI题库 2704:寻找平面上的极大点

标签:

原文地址:http://www.cnblogs.com/KakagouLT/p/4905839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!