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

2021-10-19 04:22:06 字數 2422 閱讀 5663

先直接上**吧。

#include

#include

#include

using

namespace std;

#define ll long long

intmain()

int step=

sqrt

(k);

//printf("sqrt==%d ",step);

int reminder=

(k-step*step)

;//reminder表示餘數

int ans=reminder%2;

//判斷還需要偶數對還是奇數對括號;

for(

int i=

1;i<=step;i++

)printf

("(");

//首先輸出sqrt(k)個左括號;

int cnt=step+reminder/

2+reminder%2;

for(

int i=cnt;i>=

1;i--

)else

if(ans==

1&&i==2)

printf

("(");

else

printf

(")");

}printf

("\n");

}return0;

}

個人思路:

首先我們知道,每個左括號都可以和它右邊的右括號成功匹配;我們先反過來想,對於乙個括號字串(僅包含()的字串)這個字串所包含的匹配括號對數就可以很容易求出來:

匹配的括號對數=所有的(左括號 *它右邊右括號的括號數量)的和;

那麼 我們就先輸出k的算術平方根個(;接下來就是除了輸出k的算術平方根個)還有就是如何把k-(int)sqrt(k)*(int)sqrt(k)對括號輸出,我個人採用的方法是,首先,int cnt=step+reminder/2+reminder%2;cnt表示還需要多少個括號,通過reminder/2(整除!!!)計算出來在如果我用構造的括號字串的最後兩個)和前面(匹配的話,需要多少個(。這裡解釋一下,為什麼是最後兩個)?而不是三個、四個呢?因為如果用最後兩個的話,要麼可以在第sqrt(k)(括號後面新增reminder/2(完全匹配,要麼會少一對括號不能達到k個括號,那麼剩下的一對括號就可以通過在最後乙個)的前面新增乙個(實現。

下面舉乙個例子可能會更加清楚:

15==3*3+3*2;

我們可以先構造九對匹配的括號((()));就這樣,然後我們再把三個(插入到合適的位置,

倒數2+reminder%2+reminder/2個位置開始輸出(,而且15-3*3==6為偶數,所以最終構造為

((()((()).

第二個例子:

19==4*4+1*2+1

同理:先構造(((())))已經把平方數的構造出來了,接著我們需要把1個(插入到倒數2+reminder%2+reminder/2個位置,這樣操作之後,還剩下一對括號,那麼再倒數第乙個)前面插入乙個(就完成了我們的構造。

具體的構造步驟可以自己輸入幾個資料,小一點吧,太大了也不好,不容易看出來;

還有最後乙個問題就是**裡面的i++的問題了,簡單說一下吧;當里裡面的for迴圈執行完畢的時候,已經對i進行了遞減操作,但是外面的for迴圈會再次執行一遍i–,這樣,i就多減了一次,所以必須要i++;可以自己打個斷點,觀察一下喲;

還有就是,我的**裡面的` if (k<=3)

if

(k<=3)

首先是要對k=0進行特判,因為題目要求非空,其次就是,當k=3的時候按照下面的**輸出的結果是不對的,k=2和k=3的輸出結果是一樣的,這個情況比較特殊,最直接的辦法就是把k=3也給特判了。雖然這一題沒有k=3這個資料(試過了,只特判0也可以過)。但還是加上吧,畢竟追求嚴謹還是好的;

如有錯誤,歡迎指正喲

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