蓝桥杯 谓词公式赋值-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;
}

浙公网安备 33010602011771号