蓝桥杯 谓词公式赋值-1

题意

给定集合\(D\) , 含有\(n\)个元素 , \(f\)\(D\)上函数 , 值域为\(D\) , \(F\)的定义域为\(D\times D\)

求对任意x , 存在y使得\(F(x,f(y))\)在给定赋值下的真值

思路

实际上本题是一个阅读理解

由于f定义域和值域都为\(D\) , 实际上是一个双射

对给定\(n\times n\)的矩阵的每一列考虑 , 是否存在\(i\)使得\(F_{i,j}=1\) , 找到对应\(j\) , 再由双射关系找到一个对应的\(y\)

思考一下可以知道 , 必然存在对应的\(y\)使得\(f(y)=j\)

所以只要看给定矩阵每一列是否都有1就行了

我最开始这么想的 , 然后喜提90分

后面考虑实际上不一定有\(j\)就有对应的\(y\)(尽管题目说了值域为D , 但是实际取值可能只是D的一个真子集QAQ)

代码


#include<bits/stdc++.h>
using namespace std;

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
const int N = 21;
int a[N][N];
int to[21];
int main() {
    int n=read();
    for (int i = 1; i<=n;i++) {
        int  tmp =read();
        to[tmp] = i;
    }
    for (int i = 1; i<= n; i++) {
        for (int j = 1; j<= n;j++) {
            a[i][j] =read();
        }
    }
    for (int i = 1; i<= n; i++) {
        bool ans = false;
        for (int j = 1; j<= n; j++) {
            if (a[i][j] && to[j]) {
                ans |= a[i][j];
            }
        }
        if (!ans) {
            cout<<"0\n";
            return 0;
        }
    }
    cout<<1<<"\n";

    return 0;
}
posted @ 2025-06-01 10:12  Guaninf  阅读(5)  评论(0)    收藏  举报