BZOJ 3107 二進位制a b

2022-10-10 13:36:13 字數 1703 閱讀 6891

輸入三個整數\(a, b, c\),把它們寫成無前導\(0\)的二進位制整數。比如\(a=7, b=6, c=9\),寫成二進位制為\(a=111, b=110, c=1001\)。接下來以位數最多的為基準,其他整數在前面新增前導\(0\),使得\(a, b, c\)擁有相同的位數。比如在剛才的例子中,新增完前導\(0\)後為\(a=0111, b=0110, c=1001\)。最後,把\(a, b, c\)的各位進行重排,得到\(a』, b』, c』\),使得\(a』+b』=c』\)。比如在剛才的例子中,可以這樣重排:\(a』=0111, b』=0011, c』=1010\)。

你的任務是讓\(c』\)最小。如果無解,輸出\(-1\)。

輸入僅一行,包含三個整數\(a, b, c\)。

輸出僅一行,為\(c』\)的最小值。

7 6 9

\(a,b,c \le 2^\)

自己難得看出來一道高維的\(dp\)題目:\(f[i][j][k][l][m]\)表示前\(i\)位二進位制數中,\(a』\)用了\(j\)個1,\(b』\)用了\(k\)個\(1\),合成的\(c』\)在前\(i\)位中有\(l\)個\(1\)。

於是,根據二進位制加法,我們可以得到\(dp\)方程:

\[f[i+1][j+1][k][l+1][0] = min(f[i+1][j+1][k][l+1][0],f[i][j][k][l][0] \mid (1 \ll i))

\]\[f[i+1][j+1][k][l][1] = min(f[i+1][j+1][k][l][1],f[i][j][k][l][1])

\]\[f[i+1][j][k+1][l+1][0] = min(f[i+1][j][k+1][l+1][0],f[i][j][k][l][0] \mid (1 \ll i))

\]\[f[i+1][j][k+1][l][1] = min(f[i+1][j][k+1][l][1],f[i][j][k][l][1])

\]\[f[i+1][j+1][k+1][l][1] = min(f[i+1][j+1][k+1][l][1],f[i][j][k][l][0])

\]\[f[i+1][j+1][k+1][l+1][1] = min(f[i+1][j+1][k+1][l+1][1],f[i][j][k][l][1] \mid (1 \ll i))

\]\[f[i+1][j][k][l+1][0] = min(f[i+1][j][k][l+1][0],f[i][j][k][l][1] \mid (1 \ll i))

\]\[f[i+1][j][k][l][0] = min(f[i+1][j][k][l][0],f[i][j][k][l][0])

\]

#include#include#include#includeusing namespace std;

typedef long long ll;

#define maxn (35)

ll a,b,c,f[maxn][maxn][maxn][maxn][2];

int n,w1,w2,w3;

inline void ready()

inline void dp()

AB二進位制

description 若將乙個正整數化為二進位制數,在此二進位制數中,我們將數字1的個數多於數字0的個數的這類二進位制數稱為a類數,否則就稱其為b類數。例如 13 10 1101 2 其中1的個數為3,0的個數為1,則稱此數為a類數 10 10 1010 2 其中1的個數為2,0的個數也為2,稱此...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...