761 特殊的二進位制序列

2021-09-24 11:38:23 字數 1534 閱讀 7072

特殊的二進位制序列是具有以下兩個性質的二進位制序列:

0 的數量與 1 的數量相等。

二進位制序列的每乙個字首碼中 1 的數量要大於等於 0 的數量。

給定乙個特殊的二進位制序列 s,以字串形式表示。定義乙個操作 為首先選擇 s 的兩個連續且非空的特殊的子串,然後將它們交換。(兩個子串為連續的當且僅當第乙個子串的最後乙個字元恰好為第二個子串的第乙個字元的前乙個字元。)

在任意次數的操作之後,交換後的字串按照字典序排列的最大的結果是什麼?

示例 1:

輸入: s = 「11011000」

輸出: 「11100100」

解釋:將子串 「10」 (在s[1]出現) 和 「1100」 (在s[3]出現)進行交換。

這是在進行若干次操作後按字典序排列最大的結果。

說明:s 的長度不超過 50。

s 保證為乙個滿足上述定義的特殊 的二進位制序列。

網上的** 4ms

class solution

}sort(str.begin(),str.end(),cmp);

string ask = "";

for(int i = 0;i < str.size();i++)

ask += str[i];

return ask;

}static bool cmp(string a,string b)

};

解法

有幾條規律有助於我們解題:

特殊陣列一定是1開始0結尾的

特殊陣列的每個1(假設它的下標為i),都能找到乙個最小的j(s[j]= =0),使得s[i:j+1]是特殊陣列:

假設s[:i]中1比0多a個,而i以後一共有b個1,那麼s[i:]將會有有a+b>=b個0,不可能0不夠,所以j一定存在;

另外由於s[i]是1,所以一開始1就比0多乙個,假設存在i<=k<=j使得s[i:k+1]中1比0少,那麼必然會經歷【1比0多,1等於0,1少於0】的過程,這與j是最小的使得s[i:j+1]是特殊陣列的條件矛盾。

由第二條可以推出,由於s[0]一定等於1,s[0]對應的j:

要麼j= =len(s),我們把這樣的字串稱作最小單元

要麼ji-x,不然u[:i]才是最小單元,那麼必然有x-1>=i-x,所以u[1:-1]也是特殊陣列

現在我們可以得到演算法了:

假設s是最小單元,那麼我們能得到的最大字典序顯然就是"1"+solve(s[1:-1])+「0」

假設s由多個最小單元組成,那麼對每個最小單元都可以按第一步求出它們的最大字典序。下一步就是把這些單元進行排列,【通過若干次連續交換我們肯定能得到這些單元的任意排列】,怎麼排序呢?當然是字典序大的單元排在前面啦!

這樣會不會有問題呢?答案是沒有的。

假如單元們都一樣長,那麼直接排序肯定是沒問題的。

假如不一樣長,乙個單元是a,另乙個單元是b+c,其中a和b的長度相同。

如果a!=b,那麼直接按排序結果也是沒問題的

如果a==b,嗯?如果a= =b那麼b也是最小單元,那麼根本不可能出現b+c。

原文:

二進位制 二進位制起源

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

序列 2018 10 27 二進位制優化

我們可以發現,aor ba or b aorb 一定不會比a aa或者b bb要小,所以直接輸出最大的o n o n o n 內的最大或值。對於a an dba and b aand b是會越來越小的,所以長度為k kk的區間一定是有最優解,此題的關鍵就在於處理這個o 30 m o 30m o 30...

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

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