本文主要是介绍AtCoder Beginner Contest 310 B题 Strictly Superior,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
这篇关于AtCoder Beginner Contest 310 B题 Strictly Superior的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!