标签:vat 函数 algo cst style 结构 pac space bool
思路:
这道题和 UVA221 Urban Elevations 思路一样的;用结构体pot存x,y的值;
用double数组x存下每一个可以做对称轴的点,然后sort,unique,然后遍历每一个对称轴,
写一个函数看看这个对称轴可不可以完成折叠;怎么看可不可以完成折叠呢?
首先把一个坐标轴上的点都用 map<pot,bool> 存起来,再遍历一些点看看它的对称点
在不在坐标轴上,如果都在说明可以折叠。
注意:
结构体pot要重载 < 才能做map的key。
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<algorithm> 5 using namespace std; 6 #define maxn 1010 7 struct pot { 8 int x, y; 9 bool operator<(const pot &p)const//重载< 10 { 11 return this->x < p.x || (this->x == p.x&&this->y < p.y); 12 } 13 }; 14 map<pot, bool> pic;//每个点在是否在坐标轴上 15 double x[maxn*2]; 16 pot p,pots[maxn]; 17 int n; 18 bool find(double mx)//以mx为轴可不可以折叠 19 { 20 for (int i = 0; i <= n/2; i++) 21 { 22 pot p1;//p1是以mx为轴的pots[i]的对称点 23 p1.x = mx*2-pots[i].x; 24 p1.y = pots[i].y; 25 if (!pic[p1])//对称点在坐标轴上 26 { 27 return false; 28 } 29 } 30 return true; 31 } 32 33 int main() 34 { 35 int t; 36 scanf("%d", &t); 37 while (t--) 38 { 39 scanf("%d", &n); 40 for (int i = 0; i < n; i++) 41 { 42 scanf("%d%d", &p.x, &p.y); 43 pots[i] = p; 44 pic[p] = true; 45 x[i*2] = p.x; 46 if (i != 0)//两点的中点也可以做对称轴 47 x[(i-1) * 2 + 1] = (x[(i - 1) * 2] + x[i * 2]) / 2.0; 48 49 } 50 51 sort(x, x + n*2); 52 int m = unique(x, x + n*2) - x; 53 54 bool ok = false; 55 for (int i = 0; i < m; i++) 56 { 57 if (find(x[i])) 58 { 59 ok = true; 60 //printf("i=%d x[%d]=%lf\n", i,i,x[i]); 61 break; 62 } 63 } 64 65 if (ok) 66 printf("YES\n"); 67 else 68 printf("NO\n"); 69 } 70 71 return 0; 72 }
标签:vat 函数 algo cst style 结构 pac space bool
原文地址:https://www.cnblogs.com/fudanxi/p/10383002.html