Repair 暴力

本文介绍了一个关于从一块矩形金属板上切割出两块指定大小的子金属板的问题,并提供了一种有效的算法解决方案。通过枚举不同形状和位置关系,确保切割方案的可行性。

Description

standard input/output
Statements

Alex is repairing his country house. He has a rectangular metal sheet of size a × b. He has to cut two rectangular sheets of sizes a1 × b1and a2 × b2 from it. All cuts must be parallel to the sides of the initial sheet. Determine if he can do it.

Input

The first line contains two space-separated integers a and b (1 ≤ a, b ≤ 109) — the sizes of the initial sheet.

The second line contains two space-separated integers a1 and b1 (1 ≤ a1, b1 ≤ 109) — the sizes of the first sheet to cut out.

The third line contains two space-separated integers a2 and b2 (1 ≤ a2, b2 ≤ 109) — the sizes of the second sheet to cut out.

Output

Output «YES» (without quotes), if it's possible to cut two described sheets from the initial sheet, or «NO» (without quotes), if it's not possible.

Sample Input

Input
12 20
14 7
5 6
Output
YES
Input
12 20
11 9
20 7
Output
NO


枚举那两个小长方形的形状,要么躺着,要么倒着,
然后位置关系也有2中,上下或者左右。一共8种情况
枚举有技巧,不用全部写if。考怒写循环。
固定1,枚举2的两种形状,枚举2的位置关系。
固定2,枚举1的两种形状,枚举1的位置关系。
这样做的话,没法做到同时转换1和转换2.
那么考虑转换大长方形再来一次,就能考怒完全部。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
struct data {
    int row, col;
} a[5];
bool check(int torow, int tocol) {
    if (torow <= a[1].row && tocol <= a[1].col) return true;
    else return false;
}
void work() {
    for (int i = 1; i <= 3; ++i) {
        cin >> a[i].row >> a[i].col;
    }
    bool flag = false;
    for (int i = 1; i <= 2 && !flag; ++i) {
        if (check(max(a[2].row, a[3].row), a[2].col + a[3].col)) {
            flag = true;
        }
        if (check(a[2].row + a[3].row, max(a[2].col, a[3].col))) {
            flag = true;
        }
        swap(a[3].row, a[3].col);
    }
//    cout << a[3].row << " " << a[3].col << endl;
    for (int i = 1; i <= 2 && !flag; ++i) {
        if (check(max(a[2].row, a[3].row), a[2].col + a[3].col)) {
            flag = true;
        }
        if (check(a[3].row + a[2].row, max(a[2].col, a[3].col))) {
            flag = true;
        }
        swap(a[2].row, a[2].col);
    }
    swap(a[1].row, a[1].col);
    for (int i = 1; i <= 2 && !flag; ++i) {
        if (check(max(a[2].row, a[3].row), a[2].col + a[3].col)) {
            flag = true;
        }
        if (check(a[2].row + a[3].row, max(a[2].col, a[3].col))) {
            flag = true;
        }
        swap(a[3].row, a[3].col);
    }
//    cout << a[3].row << " " << a[3].col << endl;
    for (int i = 1; i <= 2 && !flag; ++i) {
        if (check(max(a[2].row, a[3].row), a[2].col + a[3].col)) {
            flag = true;
        }
        if (check(a[3].row + a[2].row, max(a[2].col, a[3].col))) {
            flag = true;
        }
        swap(a[2].row, a[2].col);
    }

    if (flag) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
}

int main() {
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    work();
    return 0;
}
View Code

 

 

转载于:https://www.cnblogs.com/liuweimingcprogram/p/5864315.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值