这题...关键在于.....计算几何能力...
atan2的用法应该是
atan2(y,x)而不是(x,y)
代码:
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; const double eps=1e-8; struct point { double x; double y; point (double xx=0,double yy=0) { x=xx; y=yy; } bool is_ans() { if (((-0.01<x)&&(x<0.01))&&(y>0)) { return true; } else { return false; } } double el_k() { return -4*x/y; } friend point operator + (const point &a,const point &b) { return point(a.x+b.x,a.y+b.y); } friend point operator * (const point &a,double b) { return point (a.x*b,a.y*b); } friend point operator / (const point &a,double b) { return point (a.x/b,a.y/b); } double val() { return 4*x*x+y*y; } void go(point k) { point l=point(x,y)+k*0.1; point r=point(x,y)+k*100; point mid; int i; for (i=0;i<=1000;i++) { mid=(l+r)/2; if (mid.val()<100) { l=mid; } else { r=mid; } } x=mid.x; y=mid.y; } }; int main() { point k=point(1.4,-(10.1+9.6)); point now; now.x=1.4; now.y=-9.6; int ans=0; for (;;) { if (now.is_ans()) break; ans++; double kk=now.el_k(); double t1=atan2(k.y,k.x); double t2=atan(kk); t1=t2*2-t1; k.x=cos(t1); k.y=sin(t1); now.go(k); } printf("%d ",ans); system("pause"); return 0; }