hdu Pizza Hub 计算几何

HDU 6398 Pizza Hub 模拟,分内讨论 Pizza Hub Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 765    Accepted Submission(s): 166Special Judge   Problem Descripti... 阅读详情

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6398

这题做了一天真是恶心!!!计算几何的题目都是这样。。。

计算几何需要注意的最大的问题就是角度或者sin、cos的值的大小判断是一个模糊的界限,不管哪一个比较大,只要差值不超过

规定的eps(一般是1e-6)就可以视为是相等的。不能单纯地用大于号或者小于号判断。

如a>b,但是fabs(a-b)<eps,则此时a=b。

这道题分为两种情况

①三角形的一条边与矩形底边重合

②三角形一个顶点卡在矩形角上,另一个搭在对面的一条边上。

一共是3+6*2=15种情况,计算最小值即可,只是debug太恶心了

注释就不删了,留着以后自己可能会看。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define mod 1000000007
#define For(i,m,n) for(int i=m;i<=n;i++)
#define Dor(i,m,n) for(int i=m;i>=n;i--)
#define LL long long
#define lan(a,b) memset(a,b,sizeof(a))
#define sqr(a) a*a
using namespace std;

const int maxn=303;
const double pi=atan(1.0)*4;
const double len=1.0001*1.0001;
//基础点和向量运算
struct Point{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);}
Vector operator / (Vector A,double p){return Vector(A.x/p,A.y/p);}
bool operator <(const Point& a, const Point& b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double eps=1e-6;
int dcmp(double x)//判断正负,或者等于0
{
    if(fabs(x)<eps)return 0;else return x<0?-1:1;
}
bool operator==(const Point& a,const Point &b)
{
    return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double Dot(Vector A, Vector B){return A.x*B.x+A.y*B.y;}//点积
double Length(Vector A){return sqrt(Dot(A,A));}//OA长
double Angle(Vector A,Vector B){return acos(Dot(A,B)/Length(A)/Length(B));}//OA和OB的夹角
double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}//叉积
double Area2(Point A,Point B,Point C){return Cross(B-A,C-A);}//三角形面积
Vector Rotate(Vector A,double rad)//rad为弧度,旋转rad度
{
    return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
Vector Normal(Vector A)//A的单位法向量,A不能为零向量
{
    double L=Length(A);
    return Vector(-A.y/L,A.x/L);
}

int main()
{
//    freopen("b.in","r",stdin);
//
//    freopen("2.txt","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double x1,y1,x2,y2,x3,y3,w;
        scanf("%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&w);
        Point a=Point(x1,y1);
        Point b=Point(x2,y2);
        Point c=Point(x3,y3);
        double s=Area2(a,b,c);
        double minn=inf;

        ///①:其中一条边与矩形底边重合
        if(Length(a-b)<=w)
        {
            double tem=fabs(Length(c-a)*cos(Angle(b-a,c-a)));
            double tem1=fabs(Length(c-b)*cos(Angle(a-b,c-b)));
//            printf("a,b tem1=%lf tem2=%lf\n",tem,tem1);
            if(tem1<=w&&tem<=w)
                minn=min(minn,Length(c-a)*sin(Angle(b-a,c-a)));
//            printf("%lf %lf\n",cos(Angle(b-a,c-a)),(sqr(Length(b-a))+sqr(Length(c-a))-sqr(Length(b-c)))/(2*Length(b-a)*Length(c-a)));
//            printf("%lf\n",Area2(a,b,c)*2/Length(b-a));
        }
        if(Length(c-b)<=w)
        {
             double tem=fabs(Length(a-c)*cos(Angle(b-c,a-c)));
            double tem1=fabs(Length(a-b)*cos(Angle(c-b,a-b)));
//            printf("b,c tem1=%lf tem2=%lf\n",tem,tem1);
            if(tem1<=w&&tem<=w)
                minn=min(minn,Length(a-c)*sin(Angle(b-c,a-c)));
        }
        if(Length(a-c)<=w)
        {
             double tem=fabs(Length(b-a)*cos(Angle(b-a,c-a)));
            double tem1=fabs(Length(b-c)*cos(Angle(b-c,a-c)));
//            printf("a,c tem1=%lf tem2=%lf\n",tem,tem1);
            if(tem1<=w&&tem<=w)
                minn=min(minn,Length(b-a)*sin(Angle(b-a,c-a)));
        }
//        printf("minn=%lf\n",minn);
        ///②:两点卡在矩形边上

        double len,a1,b1,c1;

        ///顶点为a,b在边上
        len=Length(a-b);
        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(c-a,b-a);
            if(b1<a1)
            {
                 c1=a1-b1;
                 double tem=w/cos(c1);
                 if(tem>Length(c-a))
                    minn=min(minn,tan(a1)*w);
            }
//printf("a,b minn=%lf\n",minn);
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
                if(tem>Length(c-a)||fabs(pi/2-a1-b1)<eps)
                {
                    minn=min(minn,max(Length(c-a)*sin(a1+b1),tan(a1)*w));
//                    minn=min(minn,tan(a1)*w);
                }
            }
        }


//printf("a,b minn=%lf\n",minn);

        ///顶点为a,c在边上
        len=Length(a-c);

        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(c-a,b-a);
//            printf("a1=%lf b1=%lf\n",a1,cos(b1));
            if(b1<a1)
            {
                 c1=a1-b1;
                 double tem=w/cos(c1);
                 if(tem>Length(b-a))
                    minn=min(minn,tan(a1)*w);
            }
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
                if(tem>Length(b-a)||fabs(pi/2-a1-b1)<eps)
                {
                    minn=min(minn,max(Length(b-a)*sin(a1+b1),tan(a1)*w));

                }
            }
        }

//printf("a,c minn=%lf\n",minn);

        ///顶点为b,a在边上
        len=Length(b-a);

        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(a-b,c-b);
//            printf("a1=%lf b1=%lf %.20lf %.20lf\n",a1,b1,a1+b1,fabs(pi/2-a1-b1));
            if(b1<a1)
            {
                 c1=a1-b1;
                 double tem=w/cos(c1);
                 if(tem>Length(c-b))
                    minn=min(minn,tan(a1)*w);
            }
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
//                printf("ok\n");
//                if(fabs(pi/2-a1-b1)<eps)
//                    minn=min(minn,max(Length(c-b)*sin(a1+b1),tan(a1)*w));
                if(tem>Length(c-b)||fabs(pi/2-a1-b1)<eps)
                {
//                    printf("%lf %lf\n",Length(c-b)*sin(a1+b1),tan(a1)*w);
                    minn=min(minn,max(Length(c-b)*sin(a1+b1),tan(a1)*w));
                }
            }
        }

//printf("b,a minn=%lf\n",minn);

        ///顶点为b,c在边上
        len=Length(b-c);

        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(a-b,c-b);
//            printf("a1=%lf b1=%lf\n",a1,b1);
            if(b1<a1)
            {
                 c1=a1-b1;
                 double tem=w/cos(c1);
                 if(tem>Length(a-b))
                    minn=min(minn,tan(a1)*w);
            }
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
                if(tem>Length(a-b)||fabs(pi/2-a1-b1)<eps)
                {
                    minn=min(minn,max(Length(a-b)*sin(a1+b1),tan(a1)*w));

                }
            }
        }


//printf("b,c minn=%lf\n",minn);

        ///顶点为c,a在边上
        len=Length(a-c);

        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(a-c,b-c);
//            printf("a1=%lf b1=%lf\n",a1,b1);
            if(b1<a1)
            {
                 c1=a1-b1;
//                 printf("c1=%lf\n",c1);
                 double tem=w/cos(c1);
//                 printf("tem=%lf\n len(b-c)=%lf\n",tem,Length(b-c));
                 if(tem>Length(b-c))
                    minn=min(minn,tan(a1)*w);//printf("1 min:%lf\n",tan(a1)*w);
            }
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
                if(tem>Length(b-c)||fabs(pi/2-a1-b1)<eps)
                {
                    minn=min(minn,max(Length(b-c)*sin(a1+b1),tan(a1)*w));//printf("2 min:%lf\n",Length(b-c)*sin(a1+b1));
                }
            }
        }

//printf("c,a minn=%lf\n",minn);

        ///顶点为c,b在边上
        len=Length(b-c);

        if(len>w)
        {
            a1=acos(w/len);
            b1=Angle(a-c,b-c);
//            printf("a1=%lf b1=%lf\n",a1,b1);
            if(b1<a1)
            {
                 c1=a1-b1;
                 double tem=w/cos(c1);
                 if(tem>Length(a-c))
                    minn=min(minn,tan(a1)*w);//printf("1 min:%lf\n",tan(a1)*w);
            }
            if(a1+b1<pi/2||fabs(pi/2-a1-b1)<eps)
            {
                double tem=w/cos(a1+b1);
                if(tem>Length(a-c)||fabs(pi/2-a1-b1)<eps)
                {
                    minn=min(minn,max(Length(a-c)*sin(a1+b1),tan(a1)*w));//printf("2 min:%lf\n",Length(a-c)*sin(a1+b1));;
                }
            }
        }


//printf("c,b minn=%lf\n",minn);
        if(minn!=inf)
            printf("%.9lf\n",minn);
        else
            printf("impossible\n");
    }
    return 0;
}

 

AD9361快速锁定实战:Python脚本自动生成Profile寄存器配置(附完整代码) 本文详细介绍了AD9361快速锁定(Fast Lock)功能的Python自动化配置方案,通过Python脚本自动生成精确的Profile寄存器配置,显著提升射频系统开发效率。文章包含完整的代码实现和关键算法解析,帮助工程师快速掌握AD9361寄存器设置技巧。 阅读详情

相关推荐

使用BAPISDORDER_GETDETAILEDLIST创建S/4HANA的Outbound Delivery

要在S/4HANA里创建Outbound Delivery,首先要具有一个销售订单,ID为376,通过事务码VA03查看。 只用61行代码就能实现基于这个Sales Order去创建对应的outbound delivery: REPORT zcreate_dn. DATA:lv_ship_point TYPE bapidlvcreateheader-ship_...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 827

HDU--1859--计算几何--思维

给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。 Input 测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标占一行,其中|x|和|y|小于 231;一对0 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个...

queque_heiya的博客 255

ThinkAdmin后台Getshell

通过文件包含或者图片马的方式Getshell。修改其可允许的文件类型,php不允许,可添加。系统管理->系统参数配置->本地服务器存储。

hot_milk1的博客 1864

杭电多校第五次 HDU 6354(计算几何)

两端的弧长可以通过公式 求出。现在我们则需要求出两个圆心角即可。而我们发现,两个圆心角分别可以用余弦公式求出,其中大圆的圆心角的一半的余弦为,每个小圆的圆心角的余弦的一半为,继而我们即可将问题转化为一个解三角形的问题。 #include &amp;amp;lt;bits/stdc++.h&amp;amp;gt; #define maxn 100005 using namespace std; const double eps...

城南的花 337

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6908

基于Qwen3-14B大模型的智能UI自动化测试实践

UI自动化测试是软件工程中保障产品质量的关键环节,其核心原理是通过脚本模拟用户操作,对软件界面进行功能验证。传统方法依赖于编写和维护基于元素定位的固定规则脚本,在面对复杂交互或频繁变化的界面时,维护成本高昂。大语言模型(LLM)的出现为这一领域带来了新的技术价值,其强大的自然语言理解和代码生成能力,使得测试脚本的编写从精确编码转向了任务描述。通过将大模型作为决策大脑,结合Playwright等自动化工具作为执行器,可以构建出能够理解界面、规划操作并验证结果的智能测试系统。这种方案特别适用于处理变化频繁、逻辑

weixin_42619742的博客 303

HDU-7112 计算几何

题目大意: 已知一个凸包的前提下,每次查询给出一个三角形,求平面内可以和三角形内的点构成射线穿过凸包但构成线段不穿过凸包的点的面积。 解题思路: (因为官方思路更加清晰,所以这里借用官方的思路) AC代码: #include <bits/stdc++.h> #define ft first #define sd second #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) #define seteps(N) fi

trouble_的博客 279

TCNOpen实现TRDP通信协议(源码编译运行测试)

概述 本文介绍了通过TCNOpen开源源码实现TRDP通信,包括源码下载,开发环境搭建,编译运行,测试。 Linux环境下编译运行TRDP (一) 下载CANOpen源码。 下载地址:https://sourceforge.net/p/tcnopen/trdp/HEAD/tree/ (二) 源码编译 下载源码解压过后,在根目录文件readme-makefile.txt有介绍源码的配置和编译方法。 在trdp/config目录下可以看到包含在linux环境下的编译配置文件LINUX_config;执行”m

fengweibo112的博客 9632

HDU-6398:Pizza Hub(计算几何)

Pizza Hub Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Special Judge Problem Description Coffee Chicken has started a new restaurant named Pizza Hu…b! It pro...

Mitsuha_的博客 1574

彩票预测的可能性与算法分析

彩票作为一种以随机数为基础的赌博形式,吸引了大量希望一夜暴富的参与者。尽管许多人希望通过某种方式预测彩票结果,以增加中奖几率,但彩票预测的可能性依然是一个充满争议和误解的话题。本文将探讨彩票是否能够预测的理论依据,分析可能的预测算法,并解释这些算法为何在实际应用中难以奏效。

m0_38012434的博客 2万+

快速谱峭度算法解析

最近一直在研究振动信号的最优解调带宽寻找方法,而快速谱峭度算法是最常见的一种,因此本篇文章准备对该算法做个深入解析,也相当于自己的学习记录了。本篇文章对快速谱峭度算法做了一个较为详细的介绍,实际上就是通过多组滤波器将信号分解到不同的频段,再计算每个频段的峭度,从而找到值最大的频段,进一步地我们也可以选取其他指标作为频段的选择,以便更好地找到振动信号中的故障信息。

qq1234534215的博客 2742

2018HDU 多校8 1002 Pizza Hub

题意:一个宽度固定的纸带,选一个最小的高使其能装下一个给定的三角形 大致思路:枚举三角形一条边在矩形上下边的情况和边靠边的情况。计算几何没什么特别的难点,关键是要耐心,细心。 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma G...

lbltyyj的博客 497

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

hdu 6398 Pizza Hub(计算几何)

题目:给定三角形三点坐标,可以任意旋转,和矩形的宽度,求矩形的最小高度,使得矩形能装下三角形。 思路:最优的情况下肯定是有一个顶点顶在矩形的角上,然后枚举相邻两条边哪一个在上哪一个在下面就可以了。边界很容易出错,要判断能不能装进去基础上才能找最优的放法。 #include &lt;bits/stdc++.h&gt; using namespace std; #define eps 1e-8 ...

XFire的博客 512

【系统分析师】2026年上半年真题:论文及解题思路

四篇论文围绕系统与开发实践展开: 安全架构设计强调数据加密(国密算法)、零信任访问控制及容灾架构,以某医疗云平台为例,实现RTO<5分钟的高可用保障。 架构风格应用解析微服务/事件驱动等风格选型,结合电商平台案例,通过服务拆分与异步通信提升扩展性。 需求评审机制提出正式评审与走查结合的方法,在金融系统中减少30%返工,解决业务规则二义性问题。 LLM测试生成利用大模型从需求/代码生成用例,辅以人工校验,使测试效率提升50%,覆盖边缘场景。 各篇均遵循“背景-理论-实践”结构,突出

数据知道的博客 783

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU 6398 Pizza Hub(计算几何)

Description 给出二维平面三角形的三个顶点坐标,现在要将这个三角形经过任意旋转使得其可以放在一个宽为www的矩形中,问该矩形的高度最小值 Input 第一行一整数TTT表示用例组数,每组用例输入七个整数x1,y1,x2,y2,x3,y3,wx1,y1,x2,y2,x3,y3,wx_1,y_1,x_2,y_2,x_3,y_3,w分别表示三点坐标和矩形的宽 (1≤T≤50000,0≤...

ZSQ 469

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HDU-6398-Pizza Hub(枚举+计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6398 题目大意:给出一个无限长,w宽的纸带,将一个三角形放在纸带上,使得纸帯的使用长度最短,输出最短情况,如果不能放上面,输出“impossible”。 思路:我们可以将纸带竖过来,然后取一点顶在纸带的边界,然后对他进行旋转,会有以下三种情况: 如图所示,1.灰线上的是能够在两条线之间的情况...

永远鲜红の幼月的博客 280

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HDU 6398 Pizza Hub(计算几何 三角形放置)

http://acm.hdu.edu.cn/showproblem.php?pid=6398 题意: 给一个可旋转的三角形,求一个宽为W的矩形的最小高度,使得这个三角形可以塞进去 解析: 一定有一个点在边上,所以枚举每个点P做(吉如一jls推荐的旋转平移流) 平移坐标系使得P落在原点 选择第二个点K,尝试这样放 如果不行,就这样放 或者这样 通过K的旋转,计算得到最后一个点K2的位置 这里需要注意由于精度误差acos内的部分可能是−1.0000001-1.0000001−1.0

QAQ 295

hdu 6398 Pizza Hub

                                     Pizza Hub Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 747    Accepted Submission(s): 161Special Jud...

smilelingling的博客 512

Pizza Hub HDU - 6398 (分类讨论)

https://blog.csdn.net/mitsuha_/article/details/81746486 这篇博客就写的很好 分两种情况,第一种是一条底边更好跟矩形的边重合,这时候要考虑另一条边是否在这个底边的上部,如果在下部直接return,如果在上部,考虑另一条边在底面的投影的长度与w比较,大的话就return,否则更新答案,计算这两条边的夹角,如果夹角超过90度那么也是不行...

leekerian的博客 410

HDU 4445(计算几何+暴力)

问题描述: Crazy Tank was a famous game about ten years ago. Every child liked it. Time flies, children grow up, but the memory of happy childhood will never go.  Now you’re controlling the tank Laotu on

wust_cyl的博客 443

hdu5733 (计算几何,全是公式)

tetrahedron Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 408    Accepted Submission(s): 157 Problem Description Given four p

nucshiyilang的博客 497

2014百度之星资格赛 1001 Energy Conversion(递归)题意不解释

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4278    Accepted Submission(s): 1024 Problem Description   魔法师百小度

风尘_浪子 1443

10079 - Pizza Cutting

点击打开链接 题意:用n刀可以切出最多块的Pizza。 思路:线段相交越多,所分成的区域越多。每多一刀,就让这刀与之前的全部相交,即为最大值。最后有公式的:n * (n + 1) / 2 + 1 代码: #include #include #include #include #include using namespace std; typedef l

懒人一枚。 1477

uva 565 Pizza Anyone?

/* A-P共16种要求,每种要求选择或不选择,所以可以枚举16位二进制表示所有的可能 然后对每种可能检测是否符合每个人的要求,定义一个结构体,存储每一个要求需要和不需要的披萨种类 */ #include #include #include #define MAX_SIZE 10000 typedef struct _case { int want; int dont; }req

无题 809
上一篇: hdu 6395 Sequence 分块矩阵快速幂
下一篇: hdu 6394 树分块
Dale_zero
博客等级 码龄9年 10粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值