牛客網題目位址
描述:給出乙個包含數字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 代表此處可以有任意個 前面的字元。一開始想著是正著慢慢模擬,但是顯然不可行,正著做顯然是直接使用了前面的字元,而每次特殊判斷字元後是不是 號過於複雜。第二個想著是倒著匹配,碰到 號了往新串中新增字元,...