問題A: 和音判定
与えられた文字列が有効な和音かどうかを判定する問題です。
#include
#include
#include
using namespace std;
int main() {
vector validChords {"ACE", "BDF", "CEG", "DFA", "EGB", "FAC", "GBD"};
string input;
cin >> input;
if (find(validChords.begin(), validChords.end(), input) != validChords.end()) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
問題B: TaKコードの検出
グリッド内に特定のパターンが存在するかを検出する問題です。
#include
#include
using namespace std;
int main() {
int rows, cols;
cin >> rows >> cols;
vector grid(rows);
for (auto &row : grid) {
cin >> row;
}
auto checkPattern = [&](int x, int y) {
// 3x3の角が'#'であるか確認
for (int i = x; i < x + 3; i++) {
for (int j = y; j < y + 3; j++) {
if (grid[i][j] != '#' || grid[i + 6][j + 6] != '#') {
return false;
}
}
}
// 中心線が'.'であるか確認
for (int i = 0; i < 4; i++) {
if (grid[x + 3][y + i] != '.' ||
grid[x + i][y + 3] != '.' ||
grid[x + 5][y + 5 + i] != '.' ||
grid[x + 5 + i][y + 5] != '.') {
return false;
}
}
return true;
};
// グリッド全体をスキャン
for (int i = 0; i <= rows - 9; i++) {
for (int j = 0; j <= cols - 9; j++) {
if (checkPattern(i, j)) {
cout << i + 1 << " " << j + 1 << endl;
}
}
}
return 0;
}
問題C: 不可視の手
売り手と買い手の条件を満たす最小価格Xを見つける問題です。
解法: X円で売れる人数はX円以上の価格で売れる人数と同じです。同様に、X円で買える人数はX円以下の価格で買える人数と同じです。
条件を満たす最小Xを見つけるために、売り手の価格と買い手の予算をマージし、買い手の数番目に小さい値を探します。
#include
#include
#include
using namespace std;
int main() {
int sellerCount, buyerCount;
cin >> sellerCount >> buyerCount;
vector prices(sellerCount + buyerCount);
// 売り手の価格を読み込み
for (int i = 0; i < sellerCount; i++) {
cin >> prices[i];
}
// 買い手の予算を読み込み(+1して処理を簡略化)
for (int i = 0; i < buyerCount; i++) {
cin >> prices[sellerCount + i];
prices[sellerCount + i]++;
}
// 买家の数番目に小さい値を探す
nth_element(prices.begin(), prices.begin() + buyerCount - 1, prices.end());
cout << prices[buyerCount - 1] << endl;
return 0;
}