www 被大佬们吊打了,|

wscqwq

园龄:2年粉丝:2关注:3

妹子

妹子

考虑到首先判断可以横平竖直的放进去的情况。

先让 a1<b1,a2<b2,然后判断是否存在 a1a2\andb2b2\ora1a2\andb2b2

否则,交换使得 a1a2

如图所示。

然后我们设一个 x,利用勾股定理求一条边,接着利用相似三角形,最后用两条线段相加列出方程:

a12x2+b1a1x=a2

先将左第二项移动到右边,然后再平方。

变形为一般式

(b12a12+1)x22a2b1a1x+a22a12=0

利用公式法求解。

最终的答案为较小者。

注意较大者对应另一个方程,形如:

然后如果 Δ<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;
}

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17633846.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起