Verilən aralıqlarda cüt və ya tək rəqəmin ehtimalı barədə sorğular

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur google Honeywell Über
GeyimBaxılıb 22

Biz verdik array tam ədəd, q sorğu sayı. Hər bir sorğunun bir növü müəyyənləşdirən üç tam ədədi olduğu yer. Bu o deməkdir ki, 0 vermişiksə, o deməkdir ki, verilən aralıqda tək say seçmək ehtimalı tapmalıyıq. Aralığın başlanğıc nöqtəsi və bitmə nöqtəsi olaraq təyin olunduğu yer. Hər hansı bir növ xüsusi sorğunun bu spektri daxilində. Hər bir sorğu üçün həll tapmalısınız. Hər sorğu şəklində olacaq

TSE: T = 0 verdiyiniz təqdirdə, bu A sıra içərisində (S: Başlanğıc nöqtəsi, E: Son nöqtə) cütlüyün seçmə ehtimalını tapmalı olduğunuz deməkdir.

TSE: T = 1 vermisinizsə, deməli, verilmiş A massivində verilən aralığa (S: Başlanğıc nöqtəsi, E: Son nöqtə) tək say seçmək ehtimalını tapmaq lazımdır.

misal

Input:

massiv [] = {2, 3, 4, 5, 6}

Sorğu 1: ​​1 1 3

Sorğu 1: ​​0 1 4

Çıxış:

1 / 3

1 / 2

Explanation:

bir sorğuda T = 1 verdik, yəni 1 və 3 aralığında tək bir ədədi seçmək ehtimalını tapmaq məcburiyyətindəyik.

bir sorğuda T = 0 verdik, yəni 1 və 4 aralığında cüt say seçmə ehtimalını tapmaq məcburiyyətindəyik.

Verilən aralıqlarda cüt və ya tək rəqəmin ehtimalı barədə sorğularPin

Alqoritm

  1. Tək sıra və cüt ədədlər üçün müəyyən bir sıra ilə eyni ölçüdə iki sıra düzəldin. Dizinin hər ikisinin ilk elementini 0-a başlayın.
  2. Massivdən keçin və rəqəmin tək olub olmadığını yoxlayın, sonra yaratdığımız təkNömrəli sıra dəyərini tək [i] + 1 sayına və düz [i] rəqəminə yaratdığımız cüt massivə, cüt ədəd tapılsa da eyni şəkildə doldurun, tək sayını cari tək cütNömrələr massivinə, tək nömrələr massivini isə təkNövlər cərgəsinə saxlayın.
  3. Sorğu sayına qədər keçin və sağ, sol və 1 fərqini saxlayın.
  4. Ehtimalı tapmaq üçün cüt say və ya tək say seçməli olduğumuzu yoxlayın, əgər tək bir rəqəm varsa, onda probab-da dəyəri tək ədəd [sağ] və tək say [sol - 1] fərqi kimi saxlayın.
  5. Başqa birində probAB-da dəyəri evenNumber [sağ] və evenNumber [sol - 1] fərqi kimi saxlayın.
  6. Probabın 0-dan az və ya bərabər olduğunu yoxlayın, sonra 0-ı yazdırın, temp-ə bərabərdirsə, başqa birini yazdırın. Else sayılacaq ümumi lütf sayını tapın.
  7. Qiymət probabını və bu sayda üstünlükləri yazdırın.

Izahat

Saxlamaq üçün biri tək, digəri cüt nömrə üçün iki massiv yaradacağıq. İndi serialı keçib sıra elementinin tək və ya tək olduğunu tapacağıq. Cüt ədədi tək ədəd sayına saxlayacağıq. Və evenNumber-un əvvəlki dəyəri, evenNumber-un cari dəyərinə, sayı cüt olduqda eyni izlənilməlidir. Sonra tək dəyəri cütNo sayı və oddNumber massivinin əvvəlki dəyərini cari tək ədədin cari dəyərinə saxlayın. Bütün bunlar sırasıyla yaradılan massivlərdə bir sıra yaratmaq və doldurmaqdır.

Sorğunun növünü, sol və sağ nöqtələri bir sıra olaraq götürün, aralarındakı fərqi əldə edin. Verilən sorğunun hansı növdə olduğunu tapa bilərik. Əgər 1-dən böyükdürsə, cüt say seçmə ehtimalını tapmaq üçün tək say seçməliyik. Əks təqdirdə, aralıqda cüt ədədin olma ehtimalını tapacağıq. Əgər təkdirsə, onda yaratdığımız tək ədəd aralığının fərqini və cüt say ehtimalı ilə, cüt sayın fərqini alacağıq. Fərqi probabda saxlayacağıq və probab 0-dan az və ya bərabərdirsə 0 yazacağıq, yoxsa probab k-ya bərabərdirsə, 1-i çap edin. Başqa bir şeyin ümumi sayını tapmaq lazımdır. Və nəhayət, dəyər probabını və üstünlüklərini yazdırın.

Həyata keçirilməsi

Verilən aralıqlarda cüt və ya tək rəqəmin ehtimalına dair sorğular üçün C ++ proqramı

#include<iostream>

using namespace std;

#define C 3

int getDivisor(int a, int b)
{
    if (a == 0 || b == 0)
        return 0;

    if (a == b)
        return a;

    if (a > b)
        return getDivisor(a - b, b);

    return getDivisor(a, b - a);
}

void solveQuery(int arr[], int n, int Q,int query[][C])
{
    int evenNumber[n + 1];
    int oddNumber[n + 1];
    evenNumber[0] = oddNumber[0] = 0;

    for (int i = 0; i < n; i++)
    {
        if (arr[i] & 1)
        {
            oddNumber[i + 1] = oddNumber[i] + 1;
            evenNumber[i + 1] = evenNumber[i];
        }
        else
        {
            evenNumber[i + 1] = evenNumber[i] + 1;
            oddNumber[i + 1] = oddNumber[i];
        }
    }
    for (int i = 0; i < Q; i++)
    {
        int right = query[i][2];
        int left = query[i][1];
        int T = query[i][0];

        int dif = right - left + 1;
        int probab;

        if (T)
            probab = oddNumber[right] - oddNumber[left - 1];
        else
            probab = evenNumber[right] - evenNumber[left - 1];

        if (!probab)
            cout << "0" << endl;

        else if (probab == dif)
            cout << "1" << endl;

        else
        {
            int div = getDivisor(probab, dif);
            cout << probab / div << "/" << dif / div << endl;
        }
    }
}

int main()
{
    int arr[] = { 2,3,4,5,6};
    int n = sizeof(arr) / sizeof(arr[0]);
    int Q = 2;
    int query[Q][C] = { { 1, 1, 3 },
        { 0, 1, 4 }
    };

    solveQuery(arr, n, Q, query);
    return 0;
}
1/3
1/2

Verilən aralıqlarda cüt və ya tək sayın ehtimalı barədə sorğular üçün Java proqramı

public class QueryProbability
{
    static int getDivisor(int a, int b)
    {
        if (a == 0 || b == 0)
            return 0;

        if (a == b)
            return a;

        if (a > b)
            return getDivisor(a - b, b);

        return getDivisor(a, b - a);
    }
    
    static void solveQuery(int []arr, int n, int Q, int [][]query)
    {
        int []evenNumber = new int[n + 1];
        int []oddNumber = new int[n + 1];
        evenNumber[0] = oddNumber[0] = 0;

        for (int i = 0; i < n; i++)
        {
            if ((arr[i] & 1) > 0)
            {
                oddNumber[i + 1] = oddNumber[i] + 1;
                evenNumber[i + 1] = evenNumber[i];
            }
            else
            {
                evenNumber[i + 1] = evenNumber[i] + 1;
                oddNumber[i + 1] = oddNumber[i];
            }
        }
        
        for (int i = 0; i < Q; i++)
        {
            int right = query[i][2];
            int left = query[i][1];
            int T = query[i][0];

            int dif = right - left + 1;
            int probab;
            if (T > 0)
                probab = oddNumber[right] - oddNumber[left - 1];
            else
                probab = evenNumber[right] - evenNumber[left - 1];

            if (probab <= 0)
                System.out.println("0");
            else if (probab == dif)
                System.out.println("1");

            else
            {
                int div = getDivisor(probab, dif);
                System.out.println(probab / div + "/" +dif / div);
            }
        }
    }
    
    static public void main (String[] args)
    {
        int []arr = { 2, 3, 4, 5, 6 };
        int n = arr.length;
        int Q = 2;
        int [][]query = { { 1, 1, 3 },
            { 0, 1, 4 }
        };

        solveQuery(arr, n, Q, query);
    }
}
1/3
1/2

Verilən aralıqlarda cüt və ya tək rəqəmin ehtimalına dair sorğular üçün mürəkkəblik analizi

Zamanın mürəkkəbliyi

O (q * n) hara "Q" sorğuların sayı və "N" massivdəki elementlərin sayıdır

Kosmik Mürəkkəblik

O (n) hara "N" massivdəki elementlərin sayıdır.

arayış

Translate »