MathsCode 2025-08-08 21:17 采纳率: 0%
浏览 12

你现在正在经营一家红茶馆,而且这里有各种各样的红茶,你现在把这些红茶分成了N 个等级,每个等级的茶有一个品质 Q。现在每一个来的客人都会要求一个品质为 S 的茶,你需要迅速的回答他是否有。c++编程

题目描述
你现在正在经营一家红茶馆,而且这里有各种各样的红茶,你现在把这些红茶分成了N 个等级,每个等级的茶有一个品质 Q。现在每一个来的客人都会要求一个品质为 S 的茶,你需要迅速的回答他是否有。
输入
第一行两个数 N,M。
下面一行 N 个数,分别表示每个等级的茶的品质Q,Q值从小到大给出。
下面一行 M 个数,分别表示询问的品质 S。
注:茶的品质是长整型范围内的数。
输出
输出一行 M 个字符,表示回答是否。Y 表示有, N 表示没有

  • 写回答

7条回答 默认 最新

  • 檀越@新空间 2025-08-08 21:18
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    好的,这是一个典型的查找问题。你有 N 个不同品质的红茶(按升序排列),每个客人会询问是否存在一个品质为 S 的茶。我们需要快速判断每个 S 是否存在于 Q 数组中。

    题目分析:

    • 输入:

      • 第一行:两个整数 NM,表示红茶等级数和查询次数。
      • 第二行:N 个整数,表示每个等级的茶的品质 Q,并且是已排序的
      • 第三行:M 个整数,表示每个查询的品质 S
    • 输出:

      • 一行 M 个字符,Y 表示存在,N 表示不存在。

    解题思路:

    由于 Q有序的,我们可以使用二分查找算法来高效判断每个 S 是否存在于 Q 中。这样可以将每次查询的时间复杂度从 O(N) 降低到 O(log N),对于大规模数据非常有效。


    解决方案步骤如下:

    1. 读取输入:包括 N、M,以及两个数组 Q 和 S。
    2. 对 Q 进行排序(虽然题目说 Q 已排序,但为了保险起见,可以再次排序)。
    3. 对每个查询 S_i,使用二分查找判断是否存在于 Q 中。
    4. 输出结果:根据查找结果输出 '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::setstd::unordered_set 来进行更快的查找,但需要注意 std::set 是自动排序的,而 std::unordered_set 是哈希表结构,查找时间复杂度为 O(1)。
    • 但本题中给出的 Q 是已经排序的,因此二分查找是最优解

    总结:

    关键点:

    • 二分查找是解决此问题的核心方法。
    • 排序后的数组可以显著提升查询效率。
    • 时间复杂度:O(N log N)(排序) + O(M log N)(查询)。

    如果你有其他类似的问题或者需要扩展功能(如支持重复元素、多条件查询等),也可以继续问我!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月8日