标签:
- 总时间限制:
- 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
标签:
原文地址:http://www.cnblogs.com/KakagouLT/p/4905839.html