牛客網
構造乙個非空括號字串,要求正好包含k個合法括號對
且字串長度不能超過十萬
* 0≤k≤
10
90\leq k \leq 10^9
0≤k≤10
9看到這個k的資料範圍和字串長度要求,我們知道不能乙個勁懟括號,否則會超出長度限制
那麼我們先來思考乙個問題:把上面這個過程反過來,我們需要正好k乙個長度為n的字串,如何出現最多的括號對?(為了方便描述,我假定n為偶數)
答案是把字串一分為二,左邊全是左括號,右邊全是右括號,這樣我們就得到了(n2
)2
(\frac)^2
(2n)2
個括號對。
kk個合法括號對,那麼我們先令t=k
(向下取
整)
t=\sqrt (向下取整)
t=k(向
下取整)
,字串左邊放入t
tt個左括號,右邊放入t
tt個右括號,那麼我們就得到了t
2t^2
t2個括號對。
因為t
tt是向下取整的,所以我們可能會漏掉一些括號對,這時候需要把漏掉的括號對補上。
我們需要補上del
ta=k
−t
2delta = k-t^2
delta=
k−t2
個括號對,因為字串右邊有t
tt個右括號,所以我們每在字串左邊加乙個左括號就會增加t
tt個括號對。
在字串左邊加上del
ta/t
(向下取
整)
delta / t(向下取整)
delta/
t(向下
取整)個括號對以後,我們還需要補上del
ta%t
delta \% t
delta%
t個括號對。這時候不能再去字串左邊加左括號,因為這麼做得到的括號對會大於k
kk。這樣,我們就要從字串的右邊入手。
字串右邊現在是t
tt右括號,我們需要補上的括號對又小於t
tt,所以我們可以從右往左數del
ta%t
delta \% t
delta%
t個位置,從那裡插入乙個左括號,這樣整個字串就增加了del
ta%t
delta \% t
delta%
t個右括號,得到了剛好k
kk個合法括號對。
例子:
k =7
k=7k=
7,先生成字串 (()),再從字串左邊補上del
ta/t
=2
delta / t=2
delta/
t=2個括號對,變成((()),還差乙個括號對,從字串從右往左數第del
ta%t
delta \% t
delta%
t個位置插入左括號,得到((()(),正好7個合法括號對
#include
#include
using
namespace std;
intmain()
//k開根號先生成一些括號對
int t =
(int
)sqrt
(k);
//實際需要的括號對和當前括號對數量的差值
int delta = k - t * t;
//在最左邊每新增乙個"("就會多出t對合法括號對
for(
int i =
0; i < delta / t;
++i)
//原有的t個"("
for(
int i =
0; i < t;
++i)
//加了整數倍t個括號對以後還差delta個括號對
delta = delta % t;
//先輸出原有的t個")"
//從右往左數,差幾個括號對就從第幾個位置插入乙個"("
//如果不差括號對就不再插入(這裡放在了最後乙個)
for(
int i =
0; i < t +1;
++i)
}
2021牛客寒假演算法基礎集訓營3
三場牛客下來覺得自己越來越不在狀態,思路不清晰,一下手就是bug,每調完一題刷下榜都被甩開十里地,罰時慘不忍睹 傳送門 簽到 include using namespace std typedef long long ll const ll inf 0x3f3f3f3f const ll mod 1...
2021牛客寒假演算法基礎集訓營1
題目描述 請你構造乙個非空的括號字串,包含正好 k 個不同合法括號對。所謂括號字串,是指由 和 這兩種字元構成的字串。要求構造的字串長度不超過100000。輸入描述 乙個整數 k。乙個整數 kk。0 k 1e9 輸出描述 乙個僅包含左右括號字串,其中有 kk 個合法的括號對。如果有多種構造方法,輸出...
2021牛客寒假演算法基礎集訓營6
思路 k1排k2前面滿足 k1.a k2.ax k2.b k1.b k1.ax k1.b k2.b k2.ak1.b k2.b k1.a k2.a k1.b include define ull unsigned long long define ll long long const int inf...