妹子
考虑到首先判断可以横平竖直的放进去的情况。
先让 \(a_1<b_1,a_2<b_2\),然后判断是否存在 \(a_1\le a_2 \and b_2\le b_2\or a_1\ge a_2 \and b_2\ge b_2\)。
否则,交换使得 \(a_1\le a_2\)。
如图所示。
然后我们设一个 \(x\),利用勾股定理求一条边,接着利用相似三角形,最后用两条线段相加列出方程:
\[\sqrt{a_1^2-x^2}+\dfrac{b_1}{a_1}x=a_2 \]先将左第二项移动到右边,然后再平方。
变形为一般式
\[(\dfrac{b_1^2}{a_1^2}+1)x^2-2\dfrac{a_2b_1}{a1}x+a_2^2-a_1^2=0 \]利用公式法求解。
最终的答案为较小者。
注意较大者对应另一个方程,形如:
然后如果 \(\Delta<0\) 无解。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define db long double
using namespace std;
#define W(t) while(t--)
int n;
bool check(int a1,int b1,int a2,int b2){
db a=(db)b1*b1/a1/a1+1,b=-2.0*a2*b1/a1,c=a2*a2-a1*a1;
db delta=b*b-4*a*c;
if(delta>=0){
db x=(-b-sqrt(delta))/2/a;
db y=b1*sqrt(a1*a1-x*x)/a1;
return x+y-b2<=1e-6;
}
return 0;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&n);
W(n){
int a1,b1,a2,b2;
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
if(a1>b1)swap(a1,b1);
if(a2>b2)swap(a2,b2);
if(a1>a2)swap(a1,a2),swap(b1,b2);
if(a1<=a2&&b1<=b2)puts("Yes");
else puts(check(a1,b1,a2,b2)?"Yes":"No");//a1<=a2,b1>=b2
}
return 0;
}
标签:int,db,a1,a2,b1,b2,妹子
From: https://www.cnblogs.com/wscqwq/p/17633846.html