栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[错题]Mocha and Railgun

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[错题]Mocha and Railgun

题目链接

WA代码
#include
using 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;
}
AC代码1
#include
using 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;
}
AC代码2
#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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号