codeforces 1555 B. Two Tables (思维)

Posted _Rikka_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1555 B. Two Tables (思维)相关的知识,希望对你有一定的参考价值。

题目

思路:

首先斜着移动耗费的距离肯定高于左右或上下移动,所以只需考虑左右上下移动的情况,可以放入我主要分成了三种情况:

  1. 空余的空间能够直接放进去,无需移动。

  2. 两个矩形可以横着并排放置时,求出往左右的最小移动距离。

  3. 两个矩形可以竖着并排放置时,求助上下移动的最小距离。


其余情况为不能同时放入。

求出最小移动距离的细节见代码(有详细注释)

Code

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
	int t;cin >> t;
	while (t--)
	{
		int h, w;cin >> w >> h;

		int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;

		int w1, h1;cin >> w1 >> h1;

		int mx = max(x1, w - x2), my = max(y1, h - y2);
		//长宽最大空余长度(如第一个矩形放好了,那么往左还能移动多少,往右还能移动多少,取最大值为长的最大空余长度)

		int lx = x2 - x1, ly = y2 - y1;//第一个矩形的长宽
		int ans = 1e9 + 5;

		if (mx >= w1 || my >= h1)cout << 0 << endl;//如果剩余的最大空间能直接容纳进去则不需要移动
		else
		{
			if (lx + w1 <= w)//当两个矩形长度和比容器长度小,求出第一个矩形最小左右移动可以使得放入第二个矩形的值
			{
			ans = min(ans, w1 - mx);
			}
			if (ly + h1 <= h)//当两个矩形宽度和比容器宽度小,求出上下移动的最小值
			{
			ans = min(ans, h1 - my);//取最小
			}
			if (ans == 1e9 + 5)cout << -1 << endl;
			else cout << ans << endl;
		}
	}
}

以上是关于codeforces 1555 B. Two Tables (思维)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 112 (Rated for Div. 2) B. Two Tables

Codeforces Round #290 (Div. 2) B. Fox And Two Dots(DFS)

Educational Codeforces Round 77 (Rated for Div. 2) B. Obtain Two Zeroes

Educational Codeforces Round 77 (Rated for Div. 2) B. Obtain Two Zeroes

cf1555B. Two Tables

B. Two Buttons1400 / 简单的bfs