ABC 223 | E - Placing Rectangles
题目描述
给定,问能否在的范围中不相重叠地放置面积为的三个矩形。
数据范围
解题思路
-
首先考虑放置两个矩形的情况:
必存在一条平行于轴或轴的直线,满足以下条件:- 穿过任何一个矩形内部
- 将平面区域分为两部分,每个部分各有一个矩形
因此可以暴搜与或轴平行以及两个矩形各自的位置,判断能否不相重叠地放置两个矩形。
注意此处不是枚举的位置,而是首先填充一个矩形,再填充另一个矩形,借此隐性地枚举 -
下面考虑放置三个矩形的情况:
必存在一条平行于轴或轴的直线,满足以下条件:- 不穿过任何一个矩形内部
- 将平面区域分为两部分,一个区域含有一个矩形,另一个区域中含有两个矩形
因此可以暴搜与或轴平行以及三个矩形的摆放情况。此处可以首先枚举一个矩形的位置,然后再剩余区域内按照放置两个矩形的方法来判断。
-
关于代码撰写:
在学习代码的过程中,发先了一个很好的暴搜方法。for
循环枚举情况属,通过swap
方法进行暴搜,代码简洁。有示例如下:
bool solve3(ll x, ll y, ll a, ll b, ll c)
{
for(int i = 0; i < 2; i ++){
for(int j = 0; j < 3; j ++){
ll len = (a - 1) / x + 1;
if(len < y && solve2(x, y - len, b, c)){
return true;
}
swap(a, b);
swap(b, c);
}
swap(x, y);
}
return false;
}
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll x, y, a, b, c;
bool solve2(ll x, ll y, ll a, ll b)
{
for(int i = 0; i < 2; i ++){
ll len = (a - 1) / x + 1;
if(len < y && x * (y - len) >= b) return true;
swap(x, y);
}
return false;
}
bool solve3(ll x, ll y, ll a, ll b, ll c)
{
for(int i = 0; i < 2; i ++){
for(int j = 0; j < 3; j ++){
ll len = (a - 1) / x + 1;
if(len < y && solve2(x, y - len, b, c)){
return true;
}
swap(a, b);
swap(b, c);
}
swap(x, y);
}
return false;
}
int main()
{
scanf("%lld%lld%lld%lld%lld", &x, &y, &a, &b, &c);
if(solve3(x, y, a, b, c)) puts("Yes");
else puts("No");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库