[刷题]算法竞赛入门经典(第2版) 5-6UVa1595 - Symmetry

it2022-07-03  108

题意:平面上给若干点,问它们是不是关于某垂直于x轴的直线对称。


代码:(Wrong Answer, –ms)

//UVa1595 - Symmetry #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() { //freopen("in.txt", "r", stdin); scanf("%d", &T); while (T--) { scanf("%d", &N); vector<point> all(N); int sym(0);//2倍的对称轴 for (auto &r : all) { scanf("%d%d", &r.x, &r.y); sym += r.x; } sym = sym * 2 / N; sort(all.rbegin(), all.rend()); //printf("sym:%d\n", sym);for (int i = 0;i < N;++i) printf("%d&%d ", all[i].y, all[i].x);printf("\n");//------------ int i = 0; while (i < N) { int k, ij, j = i; while (++j != N && all[j].y == all[i].y); ij = (--j - i) / 2; //printf("i:%d\t", i);printf("j:%d\t", j);printf("ij:%d\n", ij);//---------- 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,开始怀疑人生。以下是我的测试数据,我实在是找不到其他的特殊情况了。

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

转载于:https://www.cnblogs.com/xienaoban/p/6798089.html

相关资源:Uva练习题

最新回复(0)