#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 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;
}
雖然這題不需要建表,但是想要建的話,最好不要用 vector 去存。因為內建的各種容器、資料結構通常都有不少的判斷、預處理等等,所以效能可能不盡理想。
因此,這題要存的話,就直接宣告一個字元陣列去存會比較好。
不過上面的可能並非 TLE 的主因。
scanf 的回傳值為讀取成功的變數之數量,例如:scanf("%d %d", &a, &b) ,然而剩下的資料只夠存入 a 變數,因此會回傳 1 。
不過讀取失敗的時候,可能是 0 也有可能是 EOF (通常是 EOF)。
而本題是只讀取一個變數,因此 while 迴圈的判斷式應為 scanf("%d", &n) == 1
若照原本的寫法,就算讀到了輸入串流的結尾,scanf 因而回傳 EOF 。但因為 EOF 被定義為 -1 ,而並非 0 ,因此迴圈會繼續進行。也就形成了無窮迴圈。
以上。希望有幫助到您。
雖然這題不需要建表,但是想要建的話,最好不要用 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改掉就過了~