2017年ZJUT校赛-Problem C: BugZhu抽抽抽!!——解析几何

Problem C: BugZhu抽抽抽!!——解析几何
Description
当前正火的一款手游阴阳师又出新式神了,BugZhu十分想要获得新出的式神,所以他决定花光所有的积蓄来抽抽抽!BugZhu经过长时间的研究后发现通过画三角外接圆能够提高获得该式神的概率,即如下图所示的图形:

高超的数学天分给予了BugZhu神一般的洞察力,BugZhu还发现当图中阴影部分的面积处在[l,r]之间时,他能够获得最高的概率。BugZhu现在画好了符,他能不能获得最高概率呢?

Input
不超过100组数据
每组数据第一行给出l和r(l,r均在double范围内)。
接下来3行,给出所画三角形三个顶点的坐标xi,yi(|xi|,|yi|<=1000)

Output
每组数组输出一个YES或NO表示能不能获得最高概率

Sample Input
1 5
0.0000 1.0000
-1.0000 0.0000
1.0000 0.0000

3 5
0.0000 1.0000
-1.0000 0.0000
1.0000 0.0000
Sample Output
YES
NO
分析:慢慢计算皆可。三角形面积用海伦公式,外接圆半径:面积S= abc4R
比赛时用解析几何做出来的,比较繁琐。具体公式也不好解释,很多都是中间量。
PS. PI=acos(-1.0);

*下次做题要记住用公式。

#include<iostream>
#include<cmath>
const double pi=3.14159265;
using namespace std;
double sq(double a){return a*a;}
double b(double x1,double y1,double x3,double y3){
    return (sq(x1)-sq(x3))/2/(y1-y3)+(y1+y3)/2;
}
double k(double x1,double y1,double x3,double y3){
    return (x3-x1)/(y1-y3);
}
int main(){
    double L,R;
    while(cin>>L>>R){
        double x1,x2,x3,y1,y2,y3,p,s;
        cin>>x1>>y1>>x2>>y2>>x3>>y3;
        double l1=sqrt(sq(x1-x2)+sq(y1-y2));
        double l2=sqrt(sq(x1-x3)+sq(y1-y3));
        double l3=sqrt(sq(x2-x3)+sq(y2-y3));
        double x,y;
        if(y1!=y3 && y2!=y3){
            x=(b(x1,y1,x3,y3)-b(x2,y2,x3,y3))/(k(x2,y2,x3,y3)-k(x1,y1,x3,y3));
            y=k(x1,y1,x3,y3)*x+b(x1,y1,x3,y3);
        }else if(y1!=y2 && y2!=y3){
            x=(b(x1,y1,x2,y2)-b(x2,y2,x3,y3))/(k(x2,y2,x3,y3)-k(x1,y1,x2,y2));
            y=k(x1,y1,x2,y2)*x+b(x1,y1,x2,y2);
        }else if(y1!=y2 && y1!=y3){
            x=(b(x1,y1,x2,y2)-b(x1,y1,x3,y3))/(k(x1,y1,x3,y3)-k(x1,y1,x2,y2));
            y=k(x1,y1,x2,y2)*x+b(x1,y1,x2,y2);
        }
        double r=sqrt(sq(x-x1)+sq(y-y1));
        p=(l1+l2+l3)/2;
        s=sqrt(p*(p-l3)*(p-l2)*(p-l1));
        double ans=pi*sq(r)-s;
        //cout<<pi*sq(r)<<endl;
        //cout<<s<<endl;
        //cout<<ans<<endl;
        //cout<<l<<" "<<r<<endl;
        if(ans>=L && ans<=R) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值