题解 SP35 【EQBOX - Equipment Box】

· · 题解

我是真的没见过这么难的黑题

翻译

金字塔里有个大房间叫做“不归之家”。它的地板上覆盖着等尺寸的长方形瓷砖。选择这个房间的名字是因为里面有很多陷阱和装置。acm小组花了好几年研究这个房间的秘密计划。它做了一个聪明的计划来避开所有的陷阱。一位受过专门训练的机械师被派去解除最可怕的被称为碎骨的陷阱。那个机修工在把陷阱关掉后不得不从房间里逃走。只踩瓷砖的中心是很重要的,他不可以碰瓷砖的边缘。走错一步,一块大石头从天花板上掉下来,把机修工像煎饼一样压扁了。解除陷阱后,他意识到一件可怕的事情:acm计划没有考虑他的设备箱。盒子必须放在地上,因为机修工必须双手自由,以防止与其他陷阱接触。但是当盒子放在地上时,它就会碰到分隔瓷砖的线。这就是你要解决的主要问题。

分析

这题的意思就是问是否有一种放法可以使第二个矩形在不接触第一个矩形边界的基础上放入第一个矩形,也就是能不能在一个矩形里加一个矩形 第一种情况: 判断他的长宽是否大于 第二种情况: 若它是斜的,就使用公式

接下来就是代码部分

#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
    double n,a,b,c,d;//n为组数,a,b,c,d为每两个de长宽
    cin>>n;
    for(int i=0;i<n;i++){//for循环,n为几就循环几次
        cin>>a>>b>>c>>d;//把每一次的数据输入
        if(a<b)//确定哪一个长一些
            swap(a,b);
        if(c<d)
            swap(c,d);
        if(a>c&&b>d||b>sqrt(c*c+d*d)){//第一种判断
            cout<<"Escape is possible."<<endl;
            continue;//输出完后就直接跳过进行后面的
        }  
        if(a*b<=c*d||b<=d){//二
            cout<<"Box cannot be dropped."<<endl;
            continue;
        }   
        if(sqrt(c*c+d*d)*cos(asin(b/sqrt(c*c+d*d))-2*acos(c/sqrt(c*c+d*d)))<a){//三
            cout<<"Escape is possible."<<endl;
            continue;
        }else{
            cout<<"Box cannot be dropped."<<endl;
            continue;
        }     
    }
    return 0;//结束程序
}

Thank you for your wacthing.若觉得写的可以就点个赞。

洛谷非常重视学术诚信,请不要直接复制代码
End