#include #include using namespace std;

const int N = 55, M = 55;

int n, m, k1, k2; char a[N][M]; int s[M]; //记录每一列中Y的数量

bool check(char c) { int cnt = 0; for (int i = 0; i < n; i ++ ) { int sum = 0; for (int j = 0; j < m; j ++ ) if (a[i][j] != c) sum ++ ; if (sum == k2) cnt ++ ; } if (n - cnt <= k1) return true; return false; }

int main() { int T; cin >> T; while (T -- ) { cin >> n >> m >> k1 >> k2; for (int i = 0; i < n; i ++ ) cin >> a[i];

    bool flag = false; //是否找到答案
    for (int i = 0; i < m; i ++ ) s[i] = 0;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            if (a[i][j] == 'Y') s[j] ++ ; //统计每一列中Y的数量

    for (int i = 0; i < m; i ++ )
    {
        if (s[i] + k2 == n && s[i] >= k1) //如果当前列中Y的数量等于n-k2,且大于等于k1,那么这一列应该为Y
        {
            cout << 'Y';
            flag = true;
        }
        else if (s[i] == k2 && n - k2 - s[i] <= k1) //如果当前列中Y的数量等于k2,且n-k2-Y的数量小于等于k1,那么这一列应该为N
        {
            cout << 'N';
            flag = true;
        }
        else cout << '?'; //无法确定当前列的答案
    }
    if (!flag) //无法确定答案
    {
        if (check('Y')) //如果全对的人数k1不为0,那么答案必须是全对
        {
            for (int i = 0; i < m; i ++ ) cout << 'Y';
            flag = true;
        }
        else if (check('N')) //如果全错的人数k2不为0,那么答案必须是全错
        {
            for (int i = 0; i < m; i ++ ) cout << 'N';
            flag = true;
        }
        else cout << -1; //无法确定答案
    }
    cout << endl;
}
return 0;
直接写C++代码:问题描述n 个人参加一场有且仅有 m 道判断题的考试。试卷的一份答案是指一个长度为 m 的字符串其中每个字符均为 Y 或 N 且第 i 个字符表示第 i 道题的答案。现在已知每个人的试卷的答案 以及考试全对的人数 k1 及全错的人数 k2 试找到该场考试一个可能的正确答案如果有多种可能那么就输出字典序最小的那一个如果不可能那么输出 −1。输入格式第一行一个正整数 T表示数据组数。

原文地址: https://www.cveoy.top/t/topic/hpzt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录