B题:Strictly Superior
标签:枚举、模拟
题意:给定
n
n
n个产品,第
i
i
i个产品
p
i
p_i
pi元,且有
c
i
c_i
ci个功能
f
i
,
k
f_{i,k}
fi,k(
1
<
=
k
<
=
c
i
1<=k<=c_i
1<=k<=ci)。题目求有没有以下所以条件的情况出现(
1
<
=
i
,
j
<
=
n
1<=i,j<=n
1<=i,j<=n):
- p i > = p j p_i>=p_j pi>=pj
- 第 j j j个产品有第 i i i个产品的所有功能
- 要么 p i > p j p_i>p_j pi>pj或者 第 j j j个产品功能比第 i i i个产品的功能至少多一个
题解:题意有点坑,第三个条件满足其中一个就可以了。解法就是按题目要求模拟一下,在
p
i
>
=
p
j
p_i>=p_j
pi>=pj的情况下,去检测下第
j
j
j个产品功能有没有完全覆盖第
i
i
i个产品,并计数一下多的功能数。
代码:
#include <bits/stdc++.h>
using namespace std;
int p[105], f[105][105];
int main() {
bool ans = false;
int n, m, c, x;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> p[i] >> c;
for (int j = 1; j <= c; j++) {
cin >> x;
f[i][x] = 1;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (p[j] <= p[i]) {
int cnt = 0;
bool flag = 1;
for (int k = 1; k <= m; k++) {
if (f[i][k] && !f[j][k]) {
flag = 0;
break;
}
else if (!f[i][k] && f[j][k]) {
cnt++;
}
}
if (flag == 1 && (cnt > 0 || p[j] < p[i])) {
ans = true;
break;
}
}
}
}
if (ans) cout << "Yes";
else cout << "No";
return 0;
}