けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 304 A - First Player (7Q, 灰色, 100 点)

「最小値となる添字を求める」というのは、呼吸するように書けるようになりたいところ!

問題概要

円周上に時計回りに人  1, 2, \dots, N が並んでいる。人  i の名前は  S_{i}、年齢は  A_{i} である(全員の年齢は相異なる)。

年齢が最小である人から開始して時計回りに  N 人の名前を出力せよ。

制約

  •  2 \le N \le 100

考えたこと

まず、 A_{i} が最小であるような  i を求めよう! そのような処理は人生で 10000 回は書くはずなので、呼吸をするように書けるようになろう。たとえば、次のように書ける。次のコードの min_index に、求める  i が格納される。

int min_age = A[0], min_index = 0:
for (int i = 0; i < N; i++) {
    if (A[i] < min_age) {
        min_age = A[i];
        min_index = i;
    }
}

min_index を求めてからは、そこから 1 週回るように名前を出力していけばよい。下のコードのように、 i = 0, 1, \dots, N-1 に対して S[(min_index + i) % N] を出力していけばよい。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> S[i] >> A[i];

    // 年齢が最小の人の index を求める
    int min_age = A[0], min_index = 0;
    for (int i = 0; i < N; i++) {
        if (A[i] < min_age) {
            min_age = A[i];
            min_index = i;
        }
    }

    // min_index から N 人を並べる
    for (int i = 0; i < N; i++) {
        cout << S[(min_index + i) % N] << endl;
    }
}