1 条题解
-
0
📝 题目大意
有 种食品,每种有美味度 。高桥会从美味度最大的食品中选一种来吃,但他有 种不喜欢的食品(编号 )。若他有可能吃到不喜欢的食品,输出
Yes,否则输出No。💡 解题思路
-
题目分析:,数据范围极小,直接模拟即可。核心在于理解"有可能吃到"的含义:只要存在至少一种美味度最大且同时被高桥讨厌的食品,答案就是
Yes。 -
算法推导:
- 首先遍历所有 ,找到最大值 ,同时用一个数组 记录所有美味度等于 的食品编号(即"并列第一"的食品集合)。
- 然后遍历 中的每个编号,检查它是否出现在 (讨厌列表)中。
- 只要有一个匹配,就输出
Yes并结束;全部检查完都没有匹配,输出No。 - 关键点:必须记录所有最大值位置,因为最大值可能不止一个,而高桥可能从任意一个中随机选择。
-
边界与细节:
- 初始最大值 设为 (远小于任何 ),保证第一个元素能正确更新。
- 数组 使用指针 维护:当发现更大的 时重置 并覆盖 ;当发现相等的 时追加到 。
- 讨厌列表 中的编号是 -based 的,与 中存储的编号一致,可直接比较。
⏱️ 复杂度分析
- 时间复杂度:,其中 为最大值个数,最坏 ,由于 ,完全可行。
- 空间复杂度:,仅需存储三个长度为 的数组。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; const int N = 105; int a[N], b[N], c[N]; // a: 美味度, b: 讨厌的编号, c: 最大值的所有位置 int M = -1e8; // 当前最大值,初始设为极小值 int main() { int n, m, p; // n: 食品数, m: 讨厌数, p: 最大值个数 cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; // 读入美味度 } for (int i = 1; i <= m; i++) { cin >> b[i]; // 读入讨厌的食品编号 } // 第一遍扫描:找到最大值,并记录所有等于最大值的下标 for (int i = 1; i <= n; i++) { if (a[i] > M) { // 发现更大的值,重置记录 p = 1; c[p] = i; M = a[i]; } else if (a[i] == M) { // 与最大值相等,追加记录 c[++p] = i; } } // 检查最大值位置中是否有讨厌的食品 for (int i = 1; i <= p; i++) { for (int j = 1; j <= m; j++) { if (c[i] == b[j]) { // 某个最大值恰好是讨厌的 cout << "Yes" << endl; return 0; } } } cout << "No" << endl; return 0; } -
- 1
信息
- ID
- 605
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者