c语言网1125 委派任务

https://www.dotcpp.com/oj/problem1125.html

题目描述

某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
1)A和B两人中至少去一人;
2)A和D不能一起去;
3)A、E和F三人中要派两人去;
4)B和C都去或都不去;
5)C和D两人中去一个;
6)若D不去,则E也不去。
问应当让哪几个人去?

输入格式

输出格式

要派出的人
若有多个,按字母递增顺序排列,用逗号分开(含末尾逗号)
 

样例输入

复制

样例输出

复制

A,B,C,F,

#include 
#include 
#include 
#include 

using namespace std;

// 检查是否满足所有条件
bool checkConditions(const vector& selected) {
    // A和B两人中至少去一人
    if (!selected[0] && !selected[1]) return false;

    // A和D不能一起去
    if (selected[0] && selected[3]) return false;

    // A、E和F三人中要派两人去
    int countAEF = selected[0] + selected[4] + selected[5];
    if (countAEF != 2) return false;

    // B和C都去或都不去
    if (selected[1] != selected[2]) return false;

    // C和D两人中去一个
    if (selected[2] == selected[3]) return false;

    // 若D不去,则E也不去
    if (!selected[3] && selected[4]) return false;

    return true;
}

int main() {
    vector names = {'A', 'B', 'C', 'D', 'E', 'F'};
    vector selected(6, false);

    // 穷举所有可能的组合
    for (int i = 0; i < (1 << 6); ++i) {
        for (int j = 0; j < 6; ++j) {
            selected[j] = (i & (1 << j)) ? true : false;
        }

        if (checkConditions(selected)) {
            vector result;
            for (int j = 0; j < 6; ++j) {
                if (selected[j]) {
                    result.push_back(names[j]);
                }
            }

            // 按字母顺序排序并输出结果
            sort(result.begin(), result.end());
            for (size_t j = 0; j < result.size(); ++j) {
                cout << result[j];
                if (j < result.size() - 1) cout << ",";
            }
            cout << ",";
            break; // 只需要输出一个符合条件的组合
        }
    }

    return 0;
}

你可能感兴趣的:(算法)