玄关求调,哪里错了?!
查看原帖
玄关求调,哪里错了?!
1036180
ChampionCyan楼主2024/8/1 18:12
/*<=====头文件,命名空间和宏定义=====>*/
#include <bits/stdc++.h>
#define rl(i) rec[order[i]].length
#define rw(i) rec[order[i]].width
using namespace std;

/*<==============基础定义==============>*/
struct rectangle {
    int length, width;
} rec[4];//长方形们

int order[4] = {0, 1, 2, 3};//排列顺序,初始时有序
int ans = 2e9;//答案,初始时设为极大值
set<pair<int, int> > mp;
vector<pair<int, int> > res;

/*<==============函数定义==============>*/
inline void init();//输入
inline void part1();//排列方案1
inline void part2();//排列方案2
inline void part3();//排列方案3
inline void part4();//排列方案4
inline void part5();//排列方案5
inline void part6();//排列方案6
inline void update(int, int);//更新答案
inline void do_it();//工作
inline void work(int);//工作
inline void solve();//解答

/*<==============主函数==============>*/
int main() {
    init();
    solve();
    return 0;
}

inline void init() {
    for (int i = 0; i < 4; i++)
        scanf("%d%d", &rec[i].length, &rec[i].width);
}

inline void update(int length, int width) {
    if (length > width)
        swap(length, width);
    if (length * width > ans || mp.count(make_pair(length, width)) > 0)
        return;
    /*<================以上情况不用更新!================>*/
    //更新
    if (length * width == ans) {
        mp.insert(make_pair(length, width));
        res.push_back(make_pair(length, width));
        return;
    }
    ans = length * width;
    res.clear();
    mp.insert(make_pair(length, width));
}

inline void part1() {
    update(rl(0) + rl(1) + rl(2) + rl(3), max(max(rw(0), rw(1)), max(rw(2), rw(3))));
}

inline void part2() {
    update(max(rl(0) + rl(1) + rl(2), rl(3)), max(rw(0), max(rw(1), rw(2))) + rw(3));
}

inline void part3() {
    update(max(rl(0) + rl(1), rl(2)) + rl(3), max(rw(3), max(rw(0), rw(1)) + rw(2)));
}

inline void part4() {
    update(rl(0) + max(rl(1), rl(2)) + rl(3), max(max(rw(0), rw(1) + rw(2)), rw(3)));
}

inline void part5() {
    update(max(rl(0), rl(1)) + rl(2) + rl(3), max(max(rw(0) + rw(1), rw(2)), rw(3)));
}

inline void part6() {
    //比较复杂,慢慢来
    int length;
    if (rw(2) >= rw(1) + rw(3))
        length = max(max(rl(0), rl(1) + rl(2)), rl(2) + rl(3));
    else if (rw(3) < rw(2))
        length = max(rl(0) + rl(1), max(rl(1), rl(3)) + rl(2));
    else if (rw(2) == rw(3))
        length = max(rl(0) + rl(1), rl(2) + rl(3));
    else if (rw(2) < rw(3) && rw(3) < rw(2) + rw(0))
        length = max(rl(0) + rl(1), max(rl(0), rl(2)) + rl(3));
    else if (rw(3) >= rw(0) + rw(2))
        length = max(rl(1), max(rl(0), rl(2)) + rl(3));
    update(length, max(rw(0) + rw(2), rw(1) + rw(3)));
}

inline void do_it() {
    part1();
    part2();
    part3();
    part4();
    part5();
    part6();
}

inline void work(int depth) {
    if (depth == 5) {
        do_it();
        return;
    }
    for (int i = 0; i < 4; i++) {
        swap(rec[order[i]].length, rec[order[i]].width);//旋转
        work(depth + 1);//下一种排列
        swap(rec[order[i]].length, rec[order[i]].width);//回溯
    }
}

inline void solve() {
    do
        work(1);
    while (next_permutation(order, order + 4));
    printf("%d\n", ans);
    sort(res.begin(), res.end());
    for (int i = 0; i < res.size(); i++)
        printf("%d %d\n", res[i].first, res[i].second);
}
2024/8/1 18:12
加载中...