zoukankan      html  css  js  c++  java
  • TZOJ 3244 Happy YuYu's Birthday(数学几何)

    描述

    9月10日教师节,也是YuYu的生日,妈妈给YuYu准备了一个很大的圆形蛋糕,YuYu看中了蛋糕中间那诱人的樱桃(都挤到一块啦),小家伙很高兴,心里开始盘算着如何将樱桃全部分给自己。YuYu是个“孝顺”的孩子,汗~~,每次自己不喜欢吃的都是很客气的多分点给爸妈吃,而且一定要事先尝一下(生怕爸妈吃到嘴里烫着O(∩_∩)O哈哈~),因此她开始很积极的分蛋糕了。为了简化问题,我们假设所有的樱桃合起来半径为0,即不考虑其大小。现在家里有4个人,除了一家3口,还有朋友的孩子Ayao。YuYu先在蛋糕边上找了3个点p1、p2,p3,分别沿p1p2、p2p3、p3p1切了3刀,边上的分给了其他人,最后剩下的就归自己啦(哈哈,这里全是樱桃)。不过小家伙明白自己不能拿最大的一份,否则会被妈妈打屁屁的。假如已知樱桃的位置,现在的问题是要你判断YuYu是不是分到了樱桃,而且自己分到的蛋糕是不是最大的。
    如果YuYu切的时候樱桃刚好落在刀上,小家伙会想方设法把樱桃占为己有,因此也算分到了樱桃。

     输入

    输入数据有多组,每组数据占一行,分别包含p1、p2、p3的坐标x1、y1、x2、y2、x3、y3,以及樱桃的位置p的坐标x、y。其中p1、p2、p3不共线且任何两个点不重合。所有数据均为整数。
    输入以EOF结束。

    输出

    如果YuYu分到了樱桃,而且自己分到的蛋糕大小不是最大(与某个人一样大也算不是最大),那么输出:Happy Birthday!
    如果YuYu分到了樱桃,但自己分到的蛋糕大小是最大的,那么输出:Greedy!
    如果YuYu没有分到蛋糕上的樱桃则输出:Cry!
    如果樱桃根本不可能在蛋糕上(在边上也算在蛋糕上),呵呵,那有可能小家伙在做白日梦!则输出:Happy Dream!

    样例输入

    0 0 1 1 -1 1 0 2
    0 0 1 1 -1 1 0 1
    0 0 1 1 -1 1 0 3
    0 0 3 4 -3 4 0 1

    样例输出

    Cry!
    Happy Birthday!
    Happy Dream!
    Greedy!

    题意

    有4个点,p1,p2,p3形成一个三角形为yuyu分得的,外接圆为蛋糕

    给你4个点,p1,p2,p3,p4,然后p1,p2,p3形成1个三角形,求出它的外接圆

    1.如果p4在外接圆外输出Happy Dream!

    2.如果p4不在三角形内输出Cry!

    3.如果三角形面积是剩下3块面积中最大的输出Greedy!

    否则输出Happy Birthday!

    题解

    对于1,已知三点求圆心和半径,三个点带入(x-cirx)2+(y-ciry)2=R2然后算一年后可得cirx和ciry和R

    对于2,p4如果在三角形外,p4和p1,p2,p3任意两个点面积总和大于三角形面积

    对于3,剩下三块面积,每块面积就是求出扇形面积减去三角形面积

    PS:被这个破题卡精度了,话说这个配图很吊

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 struct point
     5 {
     6     double x,y;
     7     point(double x=0,double y=0):x(x),y(y){}
     8 }p[4];
     9 double area(point a,point b,point c)
    10 {
    11     return fabs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))*0.5;
    12 }
    13 double dis2(point a,point b)
    14 {
    15     return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    16 }
    17 point circle(point a,point b,point c)
    18 {
    19     double x=((a.y-b.y)*((a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*0.5)-(a.y-c.y)*((a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*0.5))/((a.y-b.y)*(a.x-c.x)-(a.x-b.x)*(a.y-c.y));
    20     double y=((a.x-c.x)*((a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*0.5)-(a.x-b.x)*((a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*0.5))/((a.y-b.y)*(a.x-c.x)-(a.x-b.x)*(a.y-c.y));
    21     return point(x,y);
    22 }
    23 double area_s(point a,point b,point cir)
    24 {
    25     return acos((2*dis2(a,cir)-dis2(a,b))/(2*dis2(a,cir)))*dis2(a,cir)*0.5-area(a,b,cir);
    26 }
    27 int main()
    28 {
    29     while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y)!=EOF)
    30     {
    31         point cir=circle(p[0],p[1],p[2]);
    32         if(dis2(p[3],cir)>dis2(p[0],cir)){printf("Happy Dream!
    ");continue;}
    33         if(area(p[0],p[1],p[3])+area(p[0],p[2],p[3])+area(p[1],p[2],p[3])>area(p[0],p[1],p[2])){printf("Cry!
    ");continue;}
    34         double s4=area(p[0],p[1],p[2]);
    35         if(s4>area_s(p[0],p[1],cir)&&s4>area_s(p[0],p[2],cir)&&s4>(area_s(p[1],p[2],cir)))printf("Greedy!
    ");
    36         else printf("Happy Birthday!
    ");
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    机器学习:深入理解 LSTM 网络 (一)
    熵、交叉熵、相对熵(KL 散度)意义及其关系
    熵、交叉熵、相对熵(KL 散度)意义及其关系
    概率分布的 perplexity
    概率分布的 perplexity
    ImageNet 数据集
    i++与++i的区别,使用实例说明
    [置顶] ARM指令集和常用寄存器
    求大数阶数
    Wi-Fi漫游的工作原理
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/9465445.html
Copyright © 2011-2022 走看看