题面
万人迷皮皮轩收到了很多妹子的礼物,由于皮皮轩觉得每个妹子都不错,所以将她们礼物的包装盒都好好保存,但长此以往皮皮轩的房间里都堆不下了,所以只能考虑将一些包装盒放进其他包装盒里节省空间。方便起见,我们不考虑包装盒的高度和厚度,只考虑包装盒的长宽。一句话题意:给出两个矩形,问是否可以将一个矩形放在另一个矩形的内部(含边界),多测。
对于 100% 的数据,n ≤ 10,a 1 ,b 1 ,a 2 ,b 2 ≤ 1000。
分析
其实矩形是可以旋转的放的,所以不能直接判边长,但是旋转也很好实现,直接枚举旋转的度数。
如图,只需要枚举这个橘色的角,再分别用三角函数算出红线和蓝线有没有超过大的矩形
代码
- #include<bits/stdc++.h>
- using namespace std;
- #define db double
- #define pi 3.14
- #define deg(a) (a*pi/180)
- db x,y,mx,line;
- int n,a1,b1,a2,b2,ok;
- template<class T>
- inline void read(T &x)
- {
- x=0;
- static char c=getchar();
- while(c<'0'||c>'9') c=getchar();
- while(c>='0'&&c<='9')
- x=x*10+c-'0',c=getchar();
- }
- int main()
- {
- read(n);
- while(n--)
- {
- read(a1),read(b1),read(a2),read(b2);ok=0;
- if(a1>b1)swap(a1,b1);if(a2>b2)swap(a2,b2);
- if(a1>a2){swap(b1,b2),swap(a1,a2);}
- if(b1<=b2){printf("Yes ");continue;}
- for(db d=0;d<=90.0;d+=(db)0.01)
- if(b1*sin(deg(d))+a1*cos(deg(d))<=a2&&a1*sin(deg(d))+b1*cos(deg(d))<=b2)
- {printf("Yes ");ok=1;break;}
- if(!ok)printf("No ");
- }
- return 0;
- }