では前回に引き続きAtcoderのBeginerコンテストの267の解説をやる。
※このシリーズはわたしのプログラミング技術向上のためのアウトプットに過ぎないため知識不足、説明下手に関しては悪しからず。
1.ABC267
わざわざ解説するまでもない条件分岐の問題である。注意点は英語のスペルのタイプミスによってWAとならないようにすることくらいだ。
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
string S;
cin >> S;
if (S == "Monday") cout << 5 << endl;
if (S == "Tuesday") cout << 4 << endl;
if (S == "Wednesday") cout << 3 << endl;
if (S == "Thursday") cout << 2 << endl;
if (S == "Friday") cout << 1 << endl;
return 0;
}
ただこれだけの話である。
2.ABC267-B
次はボウリングのスプリットに関する問題だ。
設定がややややこしいがまずは1ピンが倒れていることが絶対条件。それを満たしたうえで、少なくとも一本のピンが立っている2列の間にすべてのピンが倒れた列が少なくとも一つ存在すればスプリットになる。のピンが倒れているか否かの情報を列ごとに配列に格納し、ピックアップした2列の間にすべてのピンが倒れた列を見つける方針でプログラムを作成する。
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
for(int i=1; i<=10; i++) {
cin >> s[i];
}
if (s[1] == '1') {
cout << "No" << endl;
return 0;
}
else {
vector<int> a(7);
for(int i=1; i<=7; i++) {
a[i] = 0;}
if(s[7] == '1') a[1]=1;
if(s[4] == '1') a[2]=1;
if((s[2] == '1') or (s[8] == '1')) a[3]=1;
if((s[5] == '1') or (s[1] == '1')) a[4]=1;
if((s[9] == '1') or (s[3] == '1')) a[5]=1;
if((s[6] == '1')) a[6]=1;
if(s[10] == '1') a[7]=1;
for (int i = 1; i <= 7; i++) {
for (int j = 1; j < i; j++) {
if (a[i] == 1 and a[j] == 1) {
for (int k = j + 1; k < i; k++) {
if (a[k] == 0) {
cout << "Yes" << endl;
return 0;
}
}
}
}
}
}
cout << "No" << endl;
return 0;
}
まずピンが倒れているか否かの情報を配列に入力し、ピン1が倒れていない時点でスプリットではないため除外。
そして各縦列に関して一つでも立っているピンが存在するのであれば配列の値を1とする(ただし配列の初期値は0)。その後は立つピンが存在するに列の間にすべてのピンが倒れている列が存在すれば、スプリットとなる。