题意:平面上给若干点,问它们是不是关于某垂直于x轴的直线对称。
代码:(Wrong Answer, --ms)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<iostream> #include<vector> #include<algorithm> using namespace std; struct point { int x, y; bool operator <(point& that)const { if (y == that.y) return x < that.x; return y < that.y; } }; int T, N;
int main() { scanf("%d", &T); while (T--) { scanf("%d", &N); vector<point> all(N); int sym(0); for (auto &r : all) { scanf("%d%d", &r.x, &r.y); sym += r.x; } sym = sym * 2 / N; sort(all.rbegin(), all.rend()); int i = 0; while (i < N) { int k, ij, j = i; while (++j != N && all[j].y == all[i].y); ij = (--j - i) / 2; for (k = 0;k <= ij;++k) { if (all[i + k].x + all[j - k].x != sym) break; } if (k <= ij) break; i = j + 1; } printf((i < N ? "NO\n" : "YES\n")); } return 0; }
|
分析:好气呀,这么简单的题目,做了一下午+一上午,无限WA,至今找不到错误。不玩了,学会放弃,以后有心情再看。 我的想法是:定义一个结构体存每个点的x、y,读取每个数据后排序,优先y从小到大,其次x从小到大(目的是方便找出每个点对应的点。例如相同的y里面,最小的x与最大的x对应)。随便找出一个可能的对称轴(可以是找最大、最小的x,相加除以二;也可以所有的x相加再除以N。我选的后者)。然后取每对对应的两个点看相加的结果是不是对称轴两倍。 然而自己的测试数据都对,到了提交就总是WA。换成网上都用的set的方法重新做一遍,还是WA,开始怀疑人生。以下是我的测试数据,我实在是找不到其他的特殊情况了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| 12
5 -2 5 0 0 6 5 4 0 2 3
4 2 3 0 4 4 0 0 0
4 5 14 6 10 5 10 6 14
10 7 -666 0 5 -1 -666 7 5 3 4 0 -666 4 4 4 -666 3 -666 8 -666
1 233 322
2 -10000 999 9999 998
2 -999 999 0 999
3 1 1 2 1 4 1
3 1 1 2 1 3 1
3 1 1 2 2 3 1
4 0 1 2 1 3 1 5 1
37 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 9 2 8 3 7 4 6 6 4 7 3 8 2 9 1 5 6 5 7 5 55 5 4 5 3 5 -45 6 5 7 5 8 5 10 5 55 5 4 5 3 5 2 5 0 5 -45 5 8 100 7 100 3 100 2 100
|