问题虫洞:three points 1
黑洞内窥:
t组样例,每组样例输入w, h, a, b, c,五个数字且都不大于50.
意为在坐标系中,0 <= x <= w, 0<=y<=h,求出三个点X, Y, Z, 并且|XY| = a, |XZ| = b, |YZ| = c,
求这三点坐标并依次输出。
思维光年:
一开始不太正确的做法:
找出最长的边c (假设这里是c)靠在x轴上,一端点在(0, 0), 然后求另一端点
如果c>x,则该边向上旋转,直到接触到wh这个矩阵的边,然后设该点为第二个端点。
之后你知道了两个点,三条边,你就可以用余弦定理和勾股定理求出第三个点,
那么问题就是你要放哪一条边更靠近y轴呢?!(或者说是挑哪一条边的端点连接零点(0,0))
相信绝大多数人和我一样放了第二大的边b(设b为第二大的边)
然后,这样的话,~~问题就解决了!! 恭喜你可以wa到死了。。。
其实咋的一想,我们都范了想当然的错误,为什么呢?!
因为有的时候你需要放小边连接零点,而放中边则会导致另一端点超出wh的范围。。。。
(有人反应BZ偷懒不画图,,,,哭唧唧~~~~再也不用word画图了)
(这个图还是比较清秀的,,,,看到了吧,,,,,)
所以,其实我们把小边和中边各跑一遍,应该可以过,(应该可以,没敲过。。)
真正的做法:
所以,不如干脆写成函数,暴力abc的每个排序,符合就输出,(而题目给出总有符合的)否则就继续找。。。
还有就是,用反函数,不要用联立余弦勾股的方程组求解(wa到怀疑人生),即便你可以二分区间找到答案。。。
对了,最后就精度问题出题人也不忘卡你一下,,,所以,,,你也要卡一下至少1e-6的精度范围。
ACcode:
//#include
//std::ios::sync_with_stdio(false);
#include
#include
#include
#include
#include