目錄
範例
方法一
演算法
Example
輸出
首頁 後端開發 C++ 在進行所有可能的K次操作後,給定二進位字串中設定位元計數的平均值

在進行所有可能的K次操作後,給定二進位字串中設定位元計數的平均值

Aug 25, 2023 pm 12:29 PM
二進位字串 k次操作 設定位計數

在進行所有可能的K次操作後,給定二進位字串中設定位元計數的平均值

在這個問題中,我們需要對給定的字串進行所有選取的 K 次運算後,求設定位元數的平均值。

可以使用暴力方法來解決問題,但我們將使用機率原理來克服暴力方法的時間複雜度。

問題陳述 - 我們給定一個整數 N,包含 K 個正整數的陣列 arr[],以及一個長度為 N 的二進位字串,其中只包含設定位。我們需要找出在執行所有可能的 K 次操作後,設定位元計數的平均值。在第 i 次操作中,我們可以翻轉給定字串中的任何 arr[i] 位元。

範例

輸入– N = 2, arr[] = {1, 2}

輸出– 1

說明 – 初始二進位字串為 11。

  • 第一步,我們可以翻轉第一個字符,字串將是01。

    • 在第二次操作中,我們需要翻轉任兩個位元。所以字串將變成10。

  • 第二個選擇可以從翻轉第一步中的第二個字元開始,字串將為 10。

    • 在目前操作的第二步驟中,我們需要翻轉任意2個位,字串可以是01。

所以,我們有兩個選擇,最終的字串可以是01或10。

總選擇 = 2,最終字串中的總設定位 = 2,ans = 2/2 = 1。

輸入– N = 3, arr[] = {2, 2}

輸出– 1.6667

Explanation – 我們有一個初始字串是111。

  • 在第一個操作中,我們可以翻轉任意 2 個字元。因此,字串可以是 001、100、010。

  • 在第二個操作中,我們可以翻轉第一個操作所得到的結果字串中的2個位元。

    • 當我們翻轉001的任兩個位元時,我們得到111、010和100。

    • 當我們翻轉 100 的任 2 位元時,我們可以得到 010、111 和 001。

    • 當我們翻轉010的任兩個位元時,我們可以得到100、001和111。

所以,在上一次操作中,我們得到了總共9個不同的字串。

9個字串中的總設定位數=15,總運算次數=9,答案=15/9=1.6667

方法一

在這裡,我們將使用機率原理來解決這個問題。假設在執行了 i-1 次操作後,設定位的平均值為 p,非設定位的平均值為 q。我們需要計算第 i 次操作中設定位和非設定位的平均值。

所以,p的更新值可以是p 新設定位的平均數 - 新關閉位的平均數。

演算法

  • 將P初始化為N,因為我們原本有N個設定位,將Q初始化為0,因為我們原本有0個設定位。

  • 遍歷操作數組。

  • 使用 P 和 Q 值初始化 prev_p 和 prev_q。

  • 使用prev_p - prev_p * arr[i] / N prev_q * arr[i] / N更新P值,這將平均將反轉的位元加到設定的位元中,並將平均設定的位反轉為未設定的位元

  • 更新 Q 值。

  • 傳回 P 值。

Example

的中文翻譯為:

範例

#include <bits/stdc++.h>
using namespace std;

double getAverageBits(int len, int K, int array[]) {
   // to store the average '1's in the binary string
   double P = len;
   // to store the average '0's in the binary string
   double Q = 0;
   // Traverse the array array[]
   for (int i = 0; i < K; i++) {
      // Initialize the prev_p and prev_q with P and Q, which we got from the previous iteration
      double prev_p = P, prev_q = Q;
      // Update the average '1's
      P = prev_p - prev_p * array[i] / len + prev_q * array[i] / len;
      // Update the average '0's
      Q = prev_q - prev_q * array[i] / len + prev_p * array[i] / len;
   }
   return P;
}
int main() {
   int N = 2;
   int array[] = {1};
   int K = sizeof(array) / sizeof(array[0]);
   cout << "The average number of set bits after performing the operations is " << getAverageBits(N, K, array);
   return 0;
}
登入後複製

輸出

The average number of set bits after performing the operations is 1
登入後複製

時間複雜度 - O(K),其中K是陣列的長度。

空間複雜度 - O(1),因為我們沒有使用任何額外的空間。

在本教程中,我們學習了在執行 K 操作的所有可能選擇後找到平均設定位。在單選中,我們需要執行數組中給出的所有操作。

以上是在進行所有可能的K次操作後,給定二進位字串中設定位元計數的平均值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

最長非遞增子序列在一個二進位字串中 最長非遞增子序列在一個二進位字串中 Sep 07, 2023 pm 11:13 PM

在這個問題中,我們需要找到給定字串的最長非遞增子序列。非遞增的意思是字元要麼相同,要麼按降序排列。由於二進位字串僅包含“0”和“1”,因此產生的字串應以“1”開頭並以“0”結尾,或以“0”或“1”開頭和結尾。為了解決這個問題,我們將統計字串每個位置的前綴“1”和後綴“0”,並找到前綴“1”和後綴“0”的最大和。問題陳述-我們給了二進位字串str。我們需要從給定的字串中找到最長的非遞增子序列。範例Input–str="010100"Output–4說明最長的非遞

在PHP中,pack()函數的作用是將資料轉換為二進位字串 在PHP中,pack()函數的作用是將資料轉換為二進位字串 Aug 31, 2023 pm 02:05 PM

pack()函數將資料打包到二進位字串中。語法pack(format,args)參數格式-要使用的格式。以下是可能的值-a-NUL填充字串A-空格填充字串h-十六進位字串,低半位元組在前H-十六進位字串,高半位元組在前c-帶符號字元C-無符號字元s-帶符號短字元(始終為16位,機器字節順序)S-無符號短整型(始終為16位,機器字節順序)n-無符號短整型(始終為16位,大端字節順序)v-無符號短整型(始終為16位,小端字節順序)i-有符號整數(取決於機器的大小和字節順序)I-無符號整數(取決

使用C++編寫,找到以1開頭的二進位字串的唯一排列數量 使用C++編寫,找到以1開頭的二進位字串的唯一排列數量 Sep 05, 2023 am 09:01 AM

在給定的問題中,我們得到一個由0和1組成的字串;我們需要找出以1開頭的所有排列的總數。由於答案可能是一個巨大的數字,所以我們將其取模1000000007後輸出。 Input:str="10101001001"Output:210Input:str="101110011"Output:56我們將透過應用一些組合數學和建立一些公式來解決這個問題。解的方法在這個方法中,我們將計算0和1的數量。現在假設n是我們字串中出現的1的數量,m是我們字串中出現的0

檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 Sep 02, 2023 pm 08:09 PM

問題陳述我們有一個字串str和一個二進位字串B。兩個字串的長度都等於N。我們需要檢查是否可以透過在字串B中包含不相等字符的任意索引對上多次交換其字符,使字串str成為回文字串。範例範例輸入str=‘AAS’B=‘101’輸出‘YES’Explanation的中文翻譯為:解釋我們可以交換str[1]和str[2],因為B[1]和B[2]不相等。最終的字串可以是'ASA'。輸入str=‘AASS’B=‘1111’輸出‘No’Explanation的中文翻譯為:解釋我們無法讓字串回文,

找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 Sep 16, 2023 am 10:21 AM

在本文中,我們將討論一個有趣的問題,涉及字串操作和博弈論領域:「透過刪除非空子字串來清空二進位字串,找到剩餘0最少的玩家」。這個問題探索了使用二進位字串進行競技遊戲的概念。我們的目標是在遊戲結束後找出剩餘0最少的玩家。我們將討論這個問題,提供一個C++程式碼實現,並透過一個例子來解釋這個概念。理解問題陳述給兩個玩家一個二進位字串,他們輪流玩遊戲。在每一回合中,玩家移除至少包含一個「1」的非空子字串。當字串變空或字串中沒有“1”時,遊戲結束。無法採取行動的玩家輸掉遊戲。任務是找到最終0

計算長度為N的二進位字串,它們是子字串的重複拼接 計算長度為N的二進位字串,它們是子字串的重複拼接 Sep 07, 2023 am 10:13 AM

本文的目的是實現一個程序,用於計算由一個子字串重複連接而成的長度為N的二進位字串的數量。目標是確定透過重複連接給定文字的單一子字串,可以創建多少長度為N的二進位字串,其中N是一個正整數。問題陳述實作一個程序,用於計算重複連接子字串的長度為N的二進位字串的數量。範例範例1LetustaketheInput,N=3Output:2Explanation的中文翻譯為:解釋下面列出了長度為N=3的可行二進位字串,其中重複連接了一個子字串。 "000":Thesubstr

透過從給定的二進位字串中選擇相等長度的子字串,最大化給定函數 透過從給定的二進位字串中選擇相等長度的子字串,最大化給定函數 Aug 28, 2023 am 09:49 AM

給定兩個相同長度的二進位字串str1和str2,我們必須透過從給定的相同長度的字串中選擇子字串來最大化給定的函數值。給定的函數是這樣的-fun(str1,str2)=(len(子字串))/(2^xor(sub1,sub2))。這裡,len(substring)是第一個子字串的長度,而xor(sub1,sub2)是給定子字串的異或,因為它們是二進位字串,所以這是可能的。範例Input1:stringstr1=10110&stringstr2=11101Output:3說明我們

將所有0放在1之前所需的最小移動次數在二進位字串中 將所有0放在1之前所需的最小移動次數在二進位字串中 Sep 23, 2023 pm 01:29 PM

問題陳述我們給定了二進位字串str,我們要求從字串中刪除最少的字符,以便我們可以將所有零放在1之前。範例輸入str=‘00110100111’輸出3說明這裡,我們可以透過兩種方式實現輸出3。我們可以從字串中刪除arr[2]、arr[3]和arr[5]或arr[4]、arr[6]和arr[7]。輸入str=‘001101011’輸出2說明我們可以刪除arr[4]和arr[6],將所有零放在1之前。輸入str=‘000111’輸出0說明在給定的字串中,所有零都已放置在1之前,因此我們不需要從

See all articles