2021牛客寒假演算法基礎集訓營1

2021-10-19 07:25:05 字數 1647 閱讀 9894

##題目描述

請你構造乙個非空的括號字串,包含正好 k 個不同合法括號對。

所謂括號字串,是指由』(『和』)'這兩種字元構成的字串。

要求構造的字串長度不超過100000。

輸入描述:

乙個整數 k。

乙個整數 kk。

0≤k≤1e9

輸出描述:

乙個僅包含左右括號字串,其中有 kk 個合法的括號對。如果有多種構造方法,輸出任意一種合法方案即可。

示例1輸入3輸出

()()

說明假設字串陣列下標從 1 開始,則 (1,2), (1,4), (3,4) 共計 3 個合法括號對

當然,"()))" 也是一種合法的構造

示例2輸入4輸出

(())

說明假設字串陣列下標從 1 開始,則 (1,3), (1,4), (2,3), (2,4) 共計 4 個合法括號對

另外,合法的構造還有"())()"、"()(()(" 等等。。

示例3輸入9輸出

()))))))))

說明合法的還可以是:

())())()

((()))

)()()())(

等等等。。有非常多種合法構造,輸出任意即可。

## 題目思路

1.先看資料範圍,0<=k<=1e9,字串長度不超過100000。直接輸出必然爆掉,所以想辦法優化。先輸出50000個「)」,然後再計算a=k/50000,有多少a就在這50000個「)」的最左邊加幾個「(」。然後計算b=k%50000,再在從右往左數第b個位置插入「(」。由於a的最大值就是20000(k=1e9時),長度最多是7e4,必然不會超出範圍。

2.1中是a=k/50000,並且是先甩50000個「)」出來,但暴力且無腦(儘管暴力已經可以ac了)。若要想讓字串左右盡量平衡,可以先畫根號a個「)」出來。然後將b=k/(根號a(取下限))個「(」放在最左邊,最後將零頭c=k%b(k=p*(k/(根號a(取下限)))+c,p=根號a取下限)補上,道理與1相同,但是字串更對稱了。例如23,根號23=4,右邊先放4個「)」,然後左邊b=23/4=5,現在一共有5*4=20個括號,再從右往左數第23%5==3個位置插入「(」。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll long long

const

int n=

1e6+7;

const

int inf =

0x3f3f3f3f

;int k;

//map> a;

intmain()

for(

int i=

0;i<=

49999

;i++

)else

}return0;

}

2021牛客寒假演算法基礎集訓營3

三場牛客下來覺得自己越來越不在狀態,思路不清晰,一下手就是bug,每調完一題刷下榜都被甩開十里地,罰時慘不忍睹 傳送門 簽到 include using namespace std typedef long long ll const ll inf 0x3f3f3f3f const ll mod 1...

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...

2021牛客寒假演算法基礎集訓營3

c.重力墜擊 題解 1.深搜。注意要避免某些圓被多次相交時重複計數的情況。2.暴力。列舉每個圓心相交的圓的數量,存到降序排列的優先佇列中,取前k個即可。include using namespace std struct node a 20 pos 20 int n,k,r int mx bool ...