标签:pre 不能 题意 lag 数据规模 strong http 描述 保存
1. 妹子
1 问题描述
万人迷皮皮轩收到了很多妹子的礼物,由于皮皮轩觉得每个妹子都不错,所以将她们礼物
的包装盒都好好保存,但长此以往皮皮轩的房间里都堆不下了,所以只能考虑将一些包装盒放
进其他包装盒里节省空间。
方便起见,我们不考虑包装盒的高度和厚度,只考虑包装盒的长宽。
一句话题意:给出两个矩形,问是否可以将一个矩形放在另一个矩形的内部(含边界),多
测。
2 输入格式
输入文件名为girls.in。
第一行,一个整数 n,表示数据组数。
对于下面的每一组数据:
第一行,四个整数 a1,b1,a2,b2 表示两个盒子的长宽。
3 输出格式
输出文件名为girls.out。
n 行,每行一个 ′′Y es′′ 或 ′′No′′(不含引号),分别表示其中一个盒子可以放到另一个盒子
中或两个盒子都不能放到另一个盒子中。
4 样例
样例输入
4
4 4 4 4
3 2 4 5
4 5 5 5
1 7 3 2
样例输出
Yes
Yes
Yes
No
5 数据规模与约定
对于 100% 的数据,n ≤ 10,a1, b1, a2, b2 ≤ 100
1.1 我拿到这道题首先就想到两条边都小于大盒子就行了(题目也说了两个盒子可以互相放入)就像这样:
交了一次发现居然wonderful answer了,
想了一想和可以这样:
结果发现只有70分;
所以不能只考虑判断边长;
再想了了想,发现可以斜着放进去,把长方形旋转着放进去,就像这样:
总而言之考虑两个矩形中心重合,一个矩形旋转,另一个矩形不动,那么旋转的矩形顶点的轨迹是 一个圆,若该圆在另一个矩形内部(包括相切),则该矩形可以放入另一个矩形,若该圆在另一 个矩形的外部(包括内接),则该矩形不能放入另一个矩形,若圆与矩形相交,不考虑相切的情 况必有 8 个交点,看一看相邻两个不在同一条边的交点能不能放短边,相隔两个不在同一条边 的交点的两个点之间能不能放长边。
Tip1: 一开始可以通过比较面积判断哪个矩形要放只能放里面。
Tip2: 内部矩形旋转出圆的轨迹后四条边其实可以看做四个弧,只要两个短弧可以放在圆与 矩形相交的弧内即可
像这样:
我们需要枚举角α的度数(0<=α<=90)再分别用三角函数算出在里面的长方形的长和宽有没有超过大的矩形
下面附上ac代码:
#include<bits/stdc++.h> using namespace std; int n,a1,a2,b1,b2; bool flag=0; long long read(){ long long number=0,fu=1; char ch=getchar(); while(ch<‘0‘ || ch>‘9‘){ if(ch==‘-‘) fu=-1; ch=getchar(); } while(ch>=‘0‘ && ch<=‘9‘){ number=(number<<1)+(number<<3)+ch-‘0‘; ch=getchar(); } return number*fu; }//快读函数 int main(){ n=read(); while(n--){ flag=0;//清空标记 a1=read(); b1=read(); a2=read(); b2=read(); if(a1*b1<=a2*b2){//判断两个矩形面积,小的放里面求角; //a1,b1小; for(double i=0;i<=90;i+=0.01){//枚举度数 double du=i*3.1415926/180;//转化为弧度制 if(a1*cos(du)+b1*sin(du)<=a2 && a1*sin(du)+b1*cos(du)<=b2) { flag=1;//打标记,装不进去时好输出No; printf("Yes"); break; } } if(!flag) printf("No"); } //a2,b2小 else { for(double i=0;i<=90;i+=0.01){ double du=i*3.1415926/180; if(a2*cos(du)+b2*sin(du)<=a1 && a2*sin(du)+b2*cos(du)<=b1) { flag=1; printf("Yes"); break; } } if(!flag) printf("No"); } if(n!=0) printf("\n");//防止我们学校的评测机不忽略行末换行,可以在输出YES,No语句后加换行符; } return 0; }
标签:pre 不能 题意 lag 数据规模 strong http 描述 保存
原文地址:https://www.cnblogs.com/DANCE-YASUO/p/11383762.html