给定范围内偶数或奇数概率的 C++ 查询

c++server side programmingprogramming

找出给定范围内数字奇偶性的概率,即它是偶数还是奇数。对于每个查询,我们需要打印 p 和 q,例如用 p / q 表示概率。

输入:N = 5,arr[] = { 6, 5, 2, 1, 7 }
查询 1:0 2 2
查询 2:1 2 5
查询 3:0 1 4

输出:0
3 4
1 2

在这个问题中,我们将维护两个数组,其中包含该索引之前存在的奇数和偶数的数量。这简化了我们的问题,现在我们需要打印它们的数量以及该范围内存在的元素数量。

寻找解决方案的方法

在这种方法中,我们维护两个数组。它们包含在第 i 个索引之前找到的偶数和奇数的数量,并像解决前缀和问题一样解决此问题。

示例

#include <bits/stdc++.h>
using namespace std;
void resolve(int arr[], int n, int Q,int query[][3]){
    int even[n + 1]; // 我们的数组用于计算在第 i 个索引之前找到的偶数的数量
    int odd[n + 1]; // 我们的数组用于计算找到的奇数的数量,直到第 i 个索引
    even[0] = 0; odd[0] = 0; // 由于我们执行基于 1 的索引,因此我们只需将两个数组的第 0 个索引设置为 0
    for (int i = 0; i < n; i++) {
        if (arr[i] & 1) { // 如果找到奇数,则增加奇数
            odd[i + 1] = odd[i] + 1;
          even[i + 1] = even[i];
        }
          else { // 否则我们增加 even
            even[i + 1] = even[i] + 1;
            odd[i + 1] = odd[i];
          }
    }
    for (int i = 0; i < Q; i++) { // 遍历查询
        int r = query[i][2]; // 正确范围
        int l = query[i][1]; // 左侧范围
        int k = query[i][0]; // 查询类型
        int q = r - l + 1; // 给定范围内的元素数量
          int p;
        if (k) // k 是查询类型,我们正在寻找
            //给定范围内具有相同奇偶校验的元素数量
            p = odd[r] - odd[l - 1];
        else
            p = even[r] - even[l - 1];
        if (!p) // 如果 p 为零,我们仅打印 0
            cout << &";0\n";
        else if (p == q) // 如果 p == q,我们打印 1
            cout << "1\n";
        else {
            int g = __gcd(p, q);
            cout << p / g << " " << q / g << "\n"; // 因为 p 不应该有共同的 gcd,所以我们除以 gcd
        }
    }
}
int main(){
    int arr[] = { 6, 5, 2, 1, 7 }; // 给定数组
    int n = sizeof(arr) / sizeof(int); // 数组大小
    int Q = 2; // 查询数量
    int query[Q][3] = {{ 0, 2, 2 },{ 1, 2, 5 }}; // 给定查询
    resolve(arr, n, Q, query);
    return 0;
}

输出

0
3 4

上述代码的解释

在上述方法中,我们通过维护两个数组来计算第 i 个索引处的偶数和奇数的数量。现在我们需要找到给定范围内存在的偶数或奇数的数量并打印该数字并打印存在的元素总数。

结论

在本教程中,我们解决了给定范围内偶数或奇数概率的查询。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。


相关文章