题目链接
WA代码#includeAC代码1using namespace std; int r; double x,y,d; double C(double d,double r){ return 2 * asin(d/r) * r;; } void calc(){ double ans1 = C(d,r); // 垂直 于过点Q的半径 double ans2; // 平行 double d0 = sqrt(x*x+y*y); // Q距离原点的距离 double d1 = d0 + d; double d2 = d0 - d; if(d2 >= 0) ans2 = (C(d1,r) - C(d2,r)) / 2; else ans2 = C(d2,r) / 2 + C(d1,r) / 2; printf("%.12fn",max(ans1,ans2)); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%lf%lf%lf",&r,&x,&y,&d); calc(); } return 0; }
#includeAC代码2using namespace std; int r; double x,y,d; double C(double d,double r){ return 2 * asin(d/r) * r;; } void calc(){ double ans1 = C(d,r); // 垂直 于过点Q的半径 double ans2; // 平行 double d0 = sqrt(x*x+y*y); // Q距离原点的距离 double d1 = d0 + d; double d2 = d0 - d; if(d2 >= 0) ans2 = (C(d1,r) - C(d2,r)) / 2; else ans2 = C(abs(d2),r) / 2 + C(d1,r) / 2; printf("%.12fn",max(ans1,ans2)); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%lf%lf%lf",&r,&x,&y,&d); calc(); } return 0; }
#include错误分析using namespace std; int r; double x,y,d; double calc(){ double k = sqrt(x*x+y*y); return (asin((k+d) / r) - asin((k - d) / r)) * r; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%lf%lf%lf",&r,&x,&y,&d); printf("%.12fn",calc()); } return 0; }
wa在于一个疏漏,没有取绝对值:
ans2 = C(d2,r) / 2 + C(d1,r) / 2;
应该改成
ans2 = C(abs(d2),r) / 2 + C(d1,r) / 2;
同时因为代码 a r c s i n arcsin arcsin函数为奇函数,所以可以将代码进一步简化为代码2。


![[错题]Mocha and Railgun [错题]Mocha and Railgun](http://www.mshxw.com/aiimages/31/1018355.png)
