题目描述
你现在正在经营一家红茶馆,而且这里有各种各样的红茶,你现在把这些红茶分成了N 个等级,每个等级的茶有一个品质 Q。现在每一个来的客人都会要求一个品质为 S 的茶,你需要迅速的回答他是否有。
输入
第一行两个数 N,M。
下面一行 N 个数,分别表示每个等级的茶的品质Q,Q值从小到大给出。
下面一行 M 个数,分别表示询问的品质 S。
注:茶的品质是长整型范围内的数。
输出
输出一行 M 个字符,表示回答是否。Y 表示有, N 表示没有
你现在正在经营一家红茶馆,而且这里有各种各样的红茶,你现在把这些红茶分成了N 个等级,每个等级的茶有一个品质 Q。现在每一个来的客人都会要求一个品质为 S 的茶,你需要迅速的回答他是否有。c++编程
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
7条回答 默认 最新
檀越@新空间 2025-08-08 21:18关注晚上好🌙🌙🌙
本答案参考通义千问好的,这是一个典型的查找问题。你有 N 个不同品质的红茶(按升序排列),每个客人会询问是否存在一个品质为 S 的茶。我们需要快速判断每个 S 是否存在于 Q 数组中。
题目分析:
-
输入:
- 第一行:两个整数
N和M,表示红茶等级数和查询次数。 - 第二行:
N个整数,表示每个等级的茶的品质Q,并且是已排序的。 - 第三行:
M个整数,表示每个查询的品质S。
- 第一行:两个整数
-
输出:
- 一行
M个字符,Y表示存在,N表示不存在。
- 一行
解题思路:
由于
Q是有序的,我们可以使用二分查找算法来高效判断每个S是否存在于Q中。这样可以将每次查询的时间复杂度从 O(N) 降低到 O(log N),对于大规模数据非常有效。
解决方案步骤如下:
- 读取输入:包括 N、M,以及两个数组 Q 和 S。
- 对 Q 进行排序(虽然题目说 Q 已排序,但为了保险起见,可以再次排序)。
- 对每个查询 S_i,使用二分查找判断是否存在于 Q 中。
- 输出结果:根据查找结果输出 'Y' 或 'N'。
C++ 实现代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; // 使用二分查找判断元素是否存在 bool binarySearch(const vector<long long>& arr, long long target) { int left = 0; int right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return true; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return false; } int main() { int N, M; cin >> N >> M; vector<long long> Q(N); for (int i = 0; i < N; ++i) { cin >> Q[i]; } // 确保 Q 是排序好的(题目说已排序,但可重复排序) sort(Q.begin(), Q.end()); vector<long long> S(M); for (int i = 0; i < M; ++i) { cin >> S[i]; } // 处理每个查询 for (long long s : S) { if (binarySearch(Q, s)) { cout << "Y"; } else { cout << "N"; } } return 0; }
代码说明:
binarySearch函数实现了标准的二分查找逻辑,用于判断目标值是否存在于有序数组中。sort(Q.begin(), Q.end())保证了数组是排序好的,即使题目说已经排序,但加上这个可以防止意外错误。- 最后遍历所有查询,输出结果。
示例输入与输出:
输入:
5 3 1 3 5 7 9 2 5 10输出:
N Y N
性能优化建议:
- 如果 N 和 M 非常大(例如百万级别),可以考虑使用
std::set或std::unordered_set来进行更快的查找,但需要注意std::set是自动排序的,而std::unordered_set是哈希表结构,查找时间复杂度为 O(1)。 - 但本题中给出的 Q 是已经排序的,因此二分查找是最优解。
总结:
关键点:
- 二分查找是解决此问题的核心方法。
- 排序后的数组可以显著提升查询效率。
- 时间复杂度:O(N log N)(排序) + O(M log N)(查询)。
如果你有其他类似的问题或者需要扩展功能(如支持重复元素、多条件查询等),也可以继续问我!
解决 无用评论 打赏 举报-