AtCoderビギナーコンテスト312 解説とコード例

問題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;
}

タグ: AtCoder C++ 競技プログラミング アルゴリズム コンテスト

5月11日 21:11 投稿