hdu 1700 向量旋转
题意:给出一个圆,以及给出一个圆上的点,求出另外的圆上两点使得三点两两之和最大
题解:向量旋转
当三个点组成正三角形时,和最大(其中的证明不知道,只是从样例输出看出来的),然后知道
其中一个点,只要围绕原点分别选择120度,240度即可。
#include <cstdio> #include <cmath> #include <algorithm> const double PI = acos(-1); struct point { double x,y; }; //向量cen->ori绕cen旋转逆时针旋转angle弧度 point getnp(point ori, point cen, double angle) { //复数平面向量旋转 point v; v.x = ori.x - cen.x; v.y = ori.y - cen.y; point res; res.x = v.x*cos(angle) - v.y*sin(angle) + cen.x; res.y = v.x*sin(angle) + v.y*cos(angle) + cen.y; return res; } int main(void) { int t; point src; scanf("%d",&t); while (t--) { scanf("%lf%lf",&src.x, &src.y); point a,b,o; o.x = 0; o.y = 0; a = getnp(src,o,PI*2.0/3.0); b = getnp(src,o,PI*4.0/3.0); if (a.y > b.y) std::swap(a,b); else if (a.y == b.y && a.x > b.x) std::swap(a,b); printf("%.3lf %.3lf %.3lf %.3lf\n",a.x,a.y,b.x,b.y); } return 0; }