BOJ/5430 AC
11624 ワード
https://noj.am/5430
この問題もクラスにあるので、できました.
接触し始めたばかりの方法.
問題は要求通りにシミュレーションで解き、タイムアウトしました.
思えば、そうする必要はないと思ったので、考え直した内容は以下の通り.
1.いずれにしても「D」コマンドは、数字全体の前後でのみ削除されます.
2.「R」コマンドが表示されたら、削除の方向を変更します.
3.だから本当に取り除く必要はなく、二重ポインタの感覚で有効な配列の範囲を表す.
4.結果に応じて適切な結果値を出力します.
この問題もクラスにあるので、できました.
接触し始めたばかりの方法.
問題は要求通りにシミュレーションで解き、タイムアウトしました.
思えば、そうする必要はないと思ったので、考え直した内容は以下の通り.
1.いずれにしても「D」コマンドは、数字全体の前後でのみ削除されます.
2.「R」コマンドが表示されたら、削除の方向を変更します.
3.だから本当に取り除く必要はなく、二重ポインタの感覚で有効な配列の範囲を表す.
4.結果に応じて適切な結果値を出力します.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int tc;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> tc;
while (tc--) {
string p; cin >> p;
int n; cin >> n;
string temp; cin >> temp;
vector<int> x;
int lastcomma = 0;
for (int i = 0; i < temp.length(); ++i) {
if ((temp[i] == ',' || temp[i] == ']') && i - lastcomma > 1) {
x.push_back(stoi(temp.substr(lastcomma + 1, i - lastcomma - 1)));
lastcomma = i;
}
}
int r = 0, d = 0;
int f = 0, b = n - 1;
bool flag = true;
for (int i = 0; i < p.length(); ++i) {
if (p[i] == 'R') {
r++;
flag = !flag;
}
else if (p[i] == 'D') {
d++;
if (flag) f++;
else b--;
}
}
if (f > b + 1)
cout << "error" << '\n';
else {
cout << '[';
if (flag) {
for (int i = f; i <= b; ++i) {
cout << x[i];
if (i != b)
cout << ',';
}
} else {
for (int i = b; i >= f; --i) {
cout << x[i];
if (i != f)
cout << ',';
}
}
cout << ']' << '\n';
}
}
}
Reference
この問題について(BOJ/5430 AC), 我々は、より多くの情報をここで見つけました https://velog.io/@tolelom/BOJ5430-ACテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol