1230:寻找平面上的极大点
Posted zkw666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1230:寻找平面上的极大点相关的知识,希望对你有一定的参考价值。
这个题我写的十分繁琐,可能没找到正确的思路,不过我也是勉强过了。
我的思路是挨个判断点的横、纵坐标,如果有点的横、纵坐标都小于某个点,就将横、纵坐标小的那个点排除。再继续判断。
我定义了a,b两个数组,分别存储点的横、纵坐标。之后将a数组从小到大排序,在套两个循环,将纵坐标在于横坐标对应上:
1 sort(a+1,a+n+1); 2 for(int i=1;i<=n;++i) 3 { 4 for(int j=1;j<=n;++j) 5 { 6 if(a[i]==c[j]) 7 { 8 b[i]=d[j]; 9 c[j]=0; 10 break; 11 } 12 } 13 }
我又定义了c,d两个数组,c数组与a数组相同,d数组与b数组相同。这样就能再将点的横、纵坐标匹配上。
接下来就要判断点坐标之间的关系:如果有的点的横、纵坐标都小于某个点,那么这个点肯定不是极大点,所以就可以把它的横、纵坐标都定义为0,就可以把它排除。
1 for(int i=1;i<=n;++i) 2 { 3 for(int j=1;j<=n;++j) 4 { 5 if(a[i]>=a[j] && b[i]>=b[j]) 6 { 7 if(a[i]==a[j] && b[i]==b[j]) 8 { 9 continue; 10 } 11 else 12 { 13 a[j]=0; 14 b[j]=0; 15 } 16 } 17 } 18 }
在输出前还要判断n即一共给的点的个数,如果n=1,直接输出这个点。
1 if(n==1) 2 { 3 cout<<"("<<a[1]<<","<<b[1]<<")"; 4 }
还有“,”的问题,可以先循环一下,用一个计数器记录一共有多少个极大点,最后先输出前几个,直到剩下一个点的时候,就再单独输出。
1 for(int i=1;i<=n;++i) 2 { 3 if(a[i]>0 || b[i]>0) 4 { 5 s++; 6 } 7 }
s就是计数器,记录极大点个数。
完整代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 int m,t=0,s=0,n,a[110],b[110],c[110],d[110]; 7 cin>>n; 8 for(int i=1;i<=n;++i) 9 { 10 cin>>a[i]>>b[i]; 11 c[i]=a[i]; 12 d[i]=b[i]; 13 } 14 if(n==1) 15 { 16 cout<<"("<<a[1]<<","<<b[1]<<")"; 17 } 18 else 19 { 20 sort(a+1,a+n+1); 21 for(int i=1;i<=n;++i) 22 { 23 for(int j=1;j<=n;++j) 24 { 25 if(a[i]==c[j]) 26 { 27 b[i]=d[j]; 28 c[j]=0; 29 break; 30 } 31 } 32 } 33 for(int i=1;i<=n;++i) 34 { 35 for(int j=1;j<=n;++j) 36 { 37 if(a[i]>=a[j] && b[i]>=b[j]) 38 { 39 if(a[i]==a[j] && b[i]==b[j]) 40 { 41 continue; 42 } 43 else 44 { 45 a[j]=0; 46 b[j]=0; 47 } 48 } 49 } 50 } 51 for(int i=1;i<=n;++i) 52 { 53 if(a[i]>0 || b[i]>0) 54 { 55 s++; 56 } 57 } 58 if(s==1) 59 { 60 for(int i=1;i<=n;++i) 61 { 62 if(a[i]>0 || b[i]>0) 63 { 64 cout<<"("<<a[i]<<","<<b[i]<<")"; 65 break; 66 } 67 } 68 } 69 else 70 { 71 for(int j=1;j<=n;++j) 72 { 73 if(a[j]==0 && b[j]==0) 74 { 75 continue; 76 } 77 else 78 { 79 cout<<"("<<a[j]<<","<<b[j]<<")"<<","; 80 t++; 81 } 82 if(t==s-1) 83 { 84 m=j; 85 break; 86 } 87 } 88 for(int i=m+1;i<=n;++i) 89 { 90 if(a[i]==0 && b[i]==0) 91 { 92 continue; 93 } 94 else 95 { 96 cout<<"("<<a[i]<<","<<b[i]<<")"; 97 } 98 } 99 } 100 } 101 return 0; 102 }
以上是关于1230:寻找平面上的极大点的主要内容,如果未能解决你的问题,请参考以下文章
2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。(代码片