牛客網最小表示式E

2021-10-02 18:24:44 字數 1296 閱讀 4672

牛客網題目位址

描述:給出乙個包含數字1-9和加號的字串,請你將字串中的字元任意排列,但每種字元數目不變,使得結果是乙個合法的表示式,而且表示式的值最小。輸出那個最小表示式的值

合法的表示式的定義如下:

保證給出的表示式經過重排,存在乙個合法的解。

輸入描述:

一行輸入乙個字串,僅包含數字1-9和加號+。

字串的長度小於5*10^5

輸出描述:

一行輸出乙個數字,代表最小的解。

輸入23984692+238752+2+34+

輸出5461

/*

我們擁有的可以放數字的數字的權值分別是1,1,1,1,1,...,1,10,10,10,10,...,10,100,...

(每種各加號個數加乙個),於是只需要貪心的將大的數字放到小權值的數字上即可。

考慮題目中的第四個樣例:23984692+238752+2+34+

這個樣例的數字排序後為['2', '2', '2', '2', '2', '3', '3', '3', '4', '4', '5', '6', '7', '8', '8', '9', '9'],

加號有四個,則意味著我們要建立五個數字。

每個數字從後向前新增數字,則先新增個位數,十位數,再新增百位數,等等等等。

並且我們一定是按照順序新增,不可能在個位數尚有未填寫的情況去填另乙個數字的百位數,

因為不優。答案為

2369+2359+248+248+237=5461

*/#include

using

namespace std;

typedef

long

long ll;

int cnt[20]

;int sum[

500050];

char s[

500050];

intmain()

else

}int p =

0,cp =0;

for(

int i=

10;i>=

1;i--)}

for(

int i=

0;i<

500010

;i++

)int opt =0;

for(

int i=

500010

;i>=

0;i--)}

cout

}

牛客 最小表示式

題目連線 題解 比賽的時候把題看錯了,以為只改變 的位置,補題時候,參考 發現數字的順序也可以改變,有點難受,如果是這樣的話,那其實挺好想的,按加號分一下塊,把數字排乙個序,從小到大一遍一遍的往塊裡加,直到加完,然後用大數加法,把他們相加就好了 不知道為甚一直發生段錯誤的 include h usi...

牛客3005E 最小表示式 大數運算

給出乙個包含數字1 9和加號的字串,請你將字串中的字元任意排列,但每種字元數目不變,使得結果是乙個合法的表示式,而且表示式的值最小。輸出那個最小表示式的值 合法的表示式的定義如下 保證給出的表示式經過重排,存在乙個合法的解。一行輸入乙個字串,僅包含數字1 9和加號 字串的長度小於5 105。一行輸出...

牛客網 正規表示式匹配

給出匹配串,給出模式串。給出兩種正則運算,乙個是.點 表示佔位代表任意乙個字元,乙個是字元 例如a 代表此處可以有任意個 前面的字元。一開始想著是正著慢慢模擬,但是顯然不可行,正著做顯然是直接使用了前面的字元,而每次特殊判斷字元後是不是 號過於複雜。第二個想著是倒著匹配,碰到 號了往新串中新增字元,...