#18937: 這題要怎麼壓到一秒一下


aajustme (jemmy)

學校 : 臺北市立建國高級中學
編號 : 100454
來源 : [101.8.144.237]
最後登入時間 :
2019-08-24 11:02:57
a229. 括號匹配問題 -- 名題精選百則 | From: [101.9.164.133] | 發表日期 : 2019-08-15 14:06

#include <bits/stdc++.h> using namespace std; int cnt[14]; vector v[14]; void dfs(string s, int l, int r, int n) { if(l >= r && l <= n) { if(r == l) { cnt[r]++; v[r].push_back(s); } dfs(s+'(', l+1, r, n); dfs(s+')', l, r+1, n); } } int main() { memset(cnt, 0, sizeof(cnt)); dfs("", 0, 0, 13); int n, kase = 0; while(scanf("%d", &n)) { if(++kase > 1) printf("\n"); for(int i = 0; i < cnt[n]; i++) { for (int j = 0; j < n*2; j++) putchar(v[n][i][j]); putchar('\n'); } } return 0; }

我這樣寫一直TLE,有沒有大神來幫幫我~

 
#18938: Re:這題要怎麼壓到一秒一下


aajustme (jemmy)

學校 : 臺北市立建國高級中學
編號 : 100454
來源 : [101.8.144.237]
最後登入時間 :
2019-08-24 11:02:57
a229. 括號匹配問題 -- 名題精選百則 | From: [101.9.164.133] | 發表日期 : 2019-08-15 14:09

#include <bits/stdc++.h> using namespace std; int cnt[14]; vector v[14]; void dfs(string s, int l, int r, int n) { if(l >= r && l <= n) { if(r == l) { cnt[r]++; v[r].push_back(s); } dfs(s+'(', l+1, r, n); dfs(s+')', l, r+1, n); } } int main() { memset(cnt, 0, sizeof(cnt)); dfs("", 0, 0, 13); int n, kase = 0; while(scanf("%d", &n)) { if(++kase > 1) printf("\n"); for(int i = 0; i < cnt[n]; i++) { for (int j = 0; j < n*2; j++) putchar(v[n][i][j]); putchar('\n'); } } return 0; }

我這樣寫一直TLE,有沒有大神來幫幫我~



#include <bits/stdc++.h>

using namespace std;

int cnt[14];

vector<string> v[14];

void dfs(string s, int l, int r, int n) {

if(l >= r && l <= n) {

if(r == l) {

cnt[r]++;

v[r].push_back(s);

}

dfs(s+'(', l+1, r, n);

dfs(s+')', l, r+1, n);

}

}

int main() {

memset(cnt, 0, sizeof(cnt));

dfs("", 0, 0, 13);

int n, kase = 0;

while(scanf("%d", &n)) {

if(++kase > 1) printf("\n");

for(int i = 0; i < cnt[n]; i++) {

for (int j = 0; j < n*2; j++)

putchar(v[n][i][j]);

putchar('\n');

}

}

return 0;

}

 
#18939: Re:這題要怎麼壓到一秒一下


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a229. 括號匹配問題 -- 名題精選百則 | From: [49.158.83.43] | 發表日期 : 2019-08-15 16:16

雖然這題不需要建表,但是想要建的話,最好不要用 vector 去存。因為內建的各種容器、資料結構通常都有不少的判斷、預處理等等,所以效能可能不盡理想。

因此,這題要存的話,就直接宣告一個字元陣列去存會比較好。

 

不過上面的可能並非 TLE 的主因。

 

scanf 的回傳值為讀取成功的變數之數量,例如:scanf("%d %d", &a, &b) ,然而剩下的資料只夠存入 a 變數,因此會回傳 1 。

不過讀取失敗的時候,可能是 0 也有可能是 EOF (通常是 EOF)。

而本題是只讀取一個變數,因此 while 迴圈的判斷式應為 scanf("%d", &n) == 1 

 

若照原本的寫法,就算讀到了輸入串流的結尾,scanf 因而回傳 EOF 。但因為 EOF 被定義為 -1 ,而並非 0 ,因此迴圈會繼續進行。也就形成了無窮迴圈。

 

以上。希望有幫助到您。

 
#18944: Re:這題要怎麼壓到一秒一下


aajustme (jemmy)

學校 : 臺北市立建國高級中學
編號 : 100454
來源 : [101.8.144.237]
最後登入時間 :
2019-08-24 11:02:57
a229. 括號匹配問題 -- 名題精選百則 | From: [220.134.40.126] | 發表日期 : 2019-08-15 18:59

雖然這題不需要建表,但是想要建的話,最好不要用 vector 去存。因為內建的各種容器、資料結構通常都有不少的判斷、預處理等等,所以效能可能不盡理想。

因此,這題要存的話,就直接宣告一個字元陣列去存會比較好。

 

不過上面的可能並非 TLE 的主因。

 

scanf 的回傳值為讀取成功的變數之數量,例如:scanf("%d %d", &a, &b) ,然而剩下的資料只夠存入 a 變數,因此會回傳 1 。

不過讀取失敗的時候,可能是 0 也有可能是 EOF (通常是 EOF)。

而本題是只讀取一個變數,因此 while 迴圈的判斷式應為 scanf("%d", &n) == 1 

 

若照原本的寫法,就算讀到了輸入串流的結尾,scanf 因而回傳 EOF 。但因為 EOF 被定義為 -1 ,而並非 0 ,因此迴圈會繼續進行。也就形成了無窮迴圈。

 

以上。希望有幫助到您。


謝謝大大,我把vector跟string改掉就過了~

 
ZeroJudge Forum