标签:ABC return ll Placing len le swap 矩形 Rectangles
题目描述
给定\(X, Y, A, B, C\),问能否在\(0 \le x \le X, 0 \le y \le Y\)的范围中不相重叠地放置面积为\(A, B, C\)的三个矩形。
数据范围
- \(1 \le X, Y \le 10^9\)
- \(1 \le A, B, C \le 10^{18}\)
解题思路
-
首先考虑放置两个矩形的情况:
必存在一条平行于\(x\)轴或\(y\)轴的直线\(l\),\(l\)满足以下条件:- \(l\)穿过任何一个矩形内部
- \(l\)将平面区域分为两部分,每个部分各有一个矩形
因此可以暴搜\(l\)与\(x\)或\(y\)轴平行以及两个矩形各自的位置,判断能否不相重叠地放置两个矩形。
注意此处不是枚举\(l\)的位置,而是首先填充一个矩形,再填充另一个矩形,借此隐性地枚举\(l\) -
下面考虑放置三个矩形的情况:
必存在一条平行于\(x\)轴或\(y\)轴的直线\(l\),\(l\)满足以下条件:- \(l\)不穿过任何一个矩形内部
- \(l\)将平面区域分为两部分,一个区域含有一个矩形,另一个区域中含有两个矩形
因此可以暴搜\(l\)与\(x\)或\(y\)轴平行以及三个矩形的摆放情况。此处可以首先枚举一个矩形的位置,然后再剩余区域内按照放置两个矩形的方法来判断。
-
关于代码撰写:
在学习代码的过程中,发先了一个很好的暴搜方法。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;
}
标签:ABC,return,ll,Placing,len,le,swap,矩形,Rectangles 来源: https://www.cnblogs.com/bxhbxh/p/16382140.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。