HDU 4720Naive and Silly Muggles热身赛2 1005题(分锐角钝角三角形讨论)

Naive and Silly Muggles

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 152    Accepted Submission(s): 107


Problem Description
Three wizards are doing a experiment. To avoid from bothering, a special magic is set around them. The magic forms a circle, which covers those three wizards, in other words, all of them are inside or on the border of the circle. And due to save the magic power, circle's area should as smaller as it could be.
Naive and silly "muggles"(who have no talents in magic) should absolutely not get into the circle, nor even on its border, or they will be in danger.
Given the position of a muggle, is he safe, or in serious danger?
 

Input
The first line has a number T (T <= 10) , indicating the number of test cases.
For each test case there are four lines. Three lines come each with two integers x i and y i (|x i, y i| <= 10), indicating the three wizards' positions. Then a single line with two numbers q x and q y (|q x, q y| <= 10), indicating the muggle's position.
 

Output
For test case X, output "Case #X: " first, then output "Danger" or "Safe".
 

Sample Input
  
  
3 0 0 2 0 1 2 1 -0.5 0 0 2 0 1 2 1 -0.6 0 0 3 0 1 1 1 -1.5
 

Sample Output
  
  
Case #1: Danger Case #2: Safe Case #3: Safe
 

Source
 


题目大意: 给你三个点,找一个最小的圆能把三个点包住。点可以允许在圆内。再给你另一个点,如果该点在圆内或圆上输出Danger,在圆外输出Safe。开始写的是直接算外接圆,这样三个点都在圆上,第三组数据过不了。看了下博博的代码,没想到直接算重心?正在想为什么的时候,就听到吉吉说是数据水了。。我们求外接圆的话对锐角三角形是可以的,但是如果是钝角三角形的话。可以把圆适当的往钝角所对的边中点移动,那样半径会变小。因为题目说了点可以在圆内或者圆上。


如图,如果是锐角三角形,外心肯定在三角形内。如左图中P的位置,如果往四方移动,半径肯定会扩大,所以这种情况可以直接解方程组。如果是钝角三角形,如右图,外心在P处,BC的中垂线上到BC两点距离相等,PQ之间都可以把A包进去。要找一个半径最小的圆。当然是以 Q为圆心QB为半径的圆啦。具体实现见代码。

题目地址:Naive and Silly Muggles

 AC代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;

int main()
{
    int tes;
    int cas=0;
    double x1,y1,x2,y2,x3,y3,a,b,r2,x,y;
    scanf("%d",&tes);
    while(tes--)
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x,&y);
        //先求出这三个点的外接圆(x-a)^2+(y-b)^2=r^2;
        //r2代表r的平方

        //先判断锐角钝角三角形

        if((x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)<0) //(x1,y1)为钝角
        {
            a=(x3+x2)/2.0,b=(y3+y2)/2.0;
            r2=(a-x2)*(a-x2)+(b-y2)*(b-y2);
        }
        else if((x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)<0) //(x2,y2)为钝角
        {
            a=(x3+x1)/2.0,b=(y3+y1)/2.0;
            r2=(a-x1)*(a-x1)+(b-y1)*(b-y1);
        }
        else if((x1-x3)*(x2-x3)+(y1-y3)*(y2-y3)<0)  //(x3,y3)为钝角
        {
            a=(x2+x1)/2.0,b=(y2+y1)/2.0;
            r2=(a-x1)*(a-x1)+(b-y1)*(b-y1);
        }
        else
        {
            a=((x1*x1+y1*y1-x2*x2-y2*y2)*(y1-y3)-(x1*x1+y1*y1-x3*x3-y3*y3)*(y1-y2))/(2.0*((y1-y3)*(x1-x2)-(y1-y2)*(x1-x3)));
            b=((x1*x1+y1*y1-x2*x2-y2*y2)*(x1-x3)-(x1*x1+y1*y1-x3*x3-y3*y3)*(x1-x2))/(2.0*((x1-x3)*(y1-y2)-(x1-x2)*(y1-y3)));
            r2=(x1-a)*(x1-a)+(y1-b)*(y1-b);
        }
        if((x-a)*(x-a)+(y-b)*(y-b)<=r2)
            printf("Case #%d: Danger\n",++cas);
        else
            printf("Case #%d: Safe\n",++cas);
    }
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值