CF1555B Two Tables题解--zhengjun

题目大意

在一个长为 \(W\),宽为 \(H\)的房间中(左下角坐标 \((0,0)\),右上角坐标 \((W,H)\)),摆放着一张桌子,其左下角和右上角坐标分别为 \((x1,y1),(x2,y2)\),现在还要继续在房间里面放另一张长、宽分别为 \(w,h\) 的桌子,问是否可行,如果可行,输出第一张桌子最小的移动距离(欧几里得距离)

思路

看到这个题目,首先可以轻松愉快地得出一个结论:

第一张桌子只能横向或纵向移动

那么这道题就迎刃而解了。

先判断无解的情况,那就是长和宽剩余的大小都容纳不下这张桌子的长和宽了。

其次,分类讨论,要么横向移动,要么纵向移动,对于一种方向上,再分类讨论,是放在左(上)边还是放在右(下)边,然后算出移动距离就好了。

注意判断不用移动的情况就好了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void read(){}
template<typename _Tp,typename... _Tps>
void read(_Tp &x,_Tps &...Ar){
	x=0;char c=getchar();bool flag=0;
	while(c<'0'||c>'9')flag|=(c=='-'),c=getchar();
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
	if(flag)x=-x;
	read(Ar...);
}
int a,b,x1,x2,y1,y2,a1,b1,a2,b2;
int get(){
	read(a,b,x1,y1,x2,y2,a2,b2);a1=x2-x1;b1=y2-y1;
	if(a1+a2>a&&b1+b2>b)return printf("-1\n"),0;
	int ans=0x3f3f3f3f;
	if(a1+a2<=a){
		if(x1>=a2||x2+a2<=a)ans=0;
		else ans=min(ans,min(a2-x1,x2+a2-a));
	}
	if(b1+b2<=b){
		if(y1>=b2||y2+b2<=b)ans=0;
		else ans=min(ans,min(b2-y1,y2+b2-b));
	}
	return printf("%d.000000000\n",ans),0;
}
int main(){
	int T;read(T);while(T--)get();
	return 0;
}
posted @ 2022-06-11 15:26  A_zjzj  阅读(26)  评论(0编辑  收藏  举报