CF1555B Two Tables题解--zhengjun

题目大意

在一个长为 W W W,宽为 H H H的房间中(左下角坐标 ( 0 , 0 ) (0,0) (0,0),右上角坐标 ( W , H ) (W,H) (W,H)),摆放着一张桌子,其左下角和右上角坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x1,y1),(x2,y2) (x1,y1),(x2,y2),现在还要继续在房间里面放另一张长、宽分别为 w , h w,h 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A_zjzj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值