はじめに
ABC333に参加したのでその振り返り。
A問
今回のA問は、単純かつ易しい内容。
回答内容は以下。
ソースコード
#include\<bits/stdc++.h>
using namespace std;
int main(void){
int number_N;
cin >> number_N;
for(int i = 0; i < number_N; i++){
cout << number_N;
}
cout << endl;
}
標準入力からNを受け取り、それをそのままN回分出力するだけ。
時間もかけずにAC(正解)。
しかしそうなると不安になるのがB問。
A問が簡単だとB問は難化するのが個人的な感覚。
B問
予想通り難しかった。1時間前後かけたが回答できず。
以下未完成だが回答。
ソースコード
#include\<bits/stdc++.h>
using namespace std;
int main(void){
char S1, S2;
char T1, T2;
cin >> S1 >> S2;
cin >> T1 >> T2;
if(S1 == T1 && S2 == T2){
cout << "Yes" << endl;
return 0;
}else if(S1 == T2 && S2 == T1){
cout << "Yes" << endl;
return 0;
}
vector<char> pentagon(5);
pentagon = {'A', 'B', 'C', 'D', 'E'};
int numberOfS1, numberOfS2, numberOfT1, numberOfT2;
for (int i = 0; i < 5; ++i) {
if (pentagon[i] == S1) {
if(i == 3){
numberOfS1 = 2;
}else if(i == 4){
numberOfS1 = 1;
}else{
numberOfS1 == i;
}
}
}
for (int i = 0; i < 5; ++i) {
if (pentagon[i] == S2) {
if(i == 3){
numberOfS2 = 2;
}else if(i == 4){
numberOfS2 = 1;
}else{
numberOfS2 == i;
}
}
}
for (int i = 0; i < 5; ++i) {
if (pentagon[i] == T1) {
if(i == 3){
numberOfT1 = 2;
}else if(i == 4){
numberOfT1 = 1;
}else{
numberOfT1 == i;
}
}
}
for (int i = 0; i < 5; ++i) {
if (pentagon[i] == T1) {
if(i == 3){
numberOfT2 = 2;
}else if(i == 4){
numberOfT2 = 1;
}else{
numberOfT2 == i;
}
}
}
cout << endl;
}
考え方としては、A~Eの頂点を得点化し、Aは初期値として0点。B・Eは1点、C・Dは2点として、A点からの距離を調べるようにした。
それで得点が同じになるかどうかで調べようとしたが、うまくいかず。
理由としては
「そもそもA点が初期値という前提で解いている。他の点が初期値になると当然解けなくなる」。
問題内の入力例を見ても、アルファベットが若い順から線分が決まるわけでない。DA・EAのような場合があるため、やはりこの考え方では解けない。
思考中、家事をしたりして頭を別のことに逸らしたりしつつ、解こうと努力してみたが結局明解なものには至らず。
今回もB問は諦めることにした。
解説を見て
線分を長短2種類に分けて、そのどちらかかを判定するだけというのは感心した。
こういう普遍的な条件を抽出する力がまだ足りていないなと実感。
また、以下解説内で得られた知見。
- ラムダ関数というC++の機能があること
簡易な計算をしたいとき、これで宣言してやってmain関数内で完結させてみるのも学習に良いかも。 - char型の文字列は文字列同士で計算させることができること
これを用いて、2つの文字列が何個分先か後かを調べることができる。
振り返り
ここ3回ほどのABC、やたらB問の難度が高い印象がある。
まだまだ過去問を解きなれていないというのが大きいとは思うが。
また、Qiitaを巡っていたら、以下参考になる記事を見つけた。
↑に記載されている 「やるとよかったこと」 を参考にして学習を進めてみる予定。
ちなみに次回のABC334は、家族とクリスマスを過ごしたので休んだ!