欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【20180809】集训题d1

程序员文章站 2022-03-02 10:21:24
...

 总结下今天比赛的情况吧,一句话,一鼓作气,三道暴力。第一道即使老师讲了可以旋转我也没在意可以斜着放,以为是道水题,如果不是出题人良心就凉了,第二道我完全应该做得出来的,方法感觉哪里听过,我也用过,考试时不知道为什么没想出来,第三道打个暴力无可厚非吧,勉强能接受一下。rank比昨天肯定好很多,但是其实这个发挥很平庸。最近心态一直比较崩,经常会觉得自己太菜有些绝望吧。到底是状态不好没有做题灵感还是水平不行,我偏向于后者吧,菜是原罪,前者也是因为后者而导致的。今天三道题目总的来说难度不是很难,目前发挥的实力与省选前的集训相去甚远,也只能继续练下去了。

 第一题我开场5分钟就切掉了,没想太多,事实证明是假的。这道题如题解所说,很优雅,我觉得其实有点思维难度,当然有人暴力枚举角度也可以,我后来研究了一下正解,如果自己不画图的话其实有点难以理解。

考虑两个矩形中心重合,一个矩形旋转,另一个矩形不动,那么旋转的矩形顶点的轨迹是一个圆,若该圆在另一个矩形内部(包括相切),则该矩形可以放入另一个矩形,若该圆在另一个矩形的外部(包括内接),则该矩形不能放入另一个矩形,若圆与矩形相交,不考虑相切的情况必有 8 个交点,看一看相邻两个不在同一条边的交点能不能放短边,相隔两个不在同一条边的交点的两个点之间能不能放长边。注意特殊情况和预处理。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i,j,m,a,b,c,d;
	double k1,k2,n,x,y,o,p,r;
	freopen("girls.in","r",stdin);
	freopen("girls.out","w",stdout);
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		scanf("%d%d%d%d",&a,&b,&c,&d);
		if(a>b) swap(a,b);
		if(c>d) swap(c,d);
		k1=sqrt((double)a*(double)a+(double)b*(double)b);
		k2=sqrt((double)c*(double)c+(double)d*(double)d);
		if(k2>k1){
			swap(k1,k2);swap(a,c);swap(b,d);
		}
		if(k2*k2-b*b<0){
			if(a>=c) puts("YES");
			else puts("NO");
		}
		else{
			n=sqrt((double)k2*(double)k2-(double)b*(double)b);
			if(n==c){
				if(a>=c)puts("YES");
				else puts("NO");
				continue;
			}
			x=((double)a+n)/2;
			y=((double)a-n)/2;
			o=sqrt((double)d*(double)d-x*x);
			p=(double)b-o;
			r=sqrt(y*y+p*p);
			if(r<c) puts("NO");
			else puts("YES");
		}
	}
	return 0;
}

 

 

 

相关标签: 几何