「最小値となる添字を求める」というのは、呼吸するように書けるようになりたいところ!
問題概要
円周上に時計回りに人 が並んでいる。人 の名前は 、年齢は である(全員の年齢は相異なる)。
年齢が最小である人から開始して時計回りに 人の名前を出力せよ。
制約
考えたこと
まず、 が最小であるような を求めよう! そのような処理は人生で 10000 回は書くはずなので、呼吸をするように書けるようになろう。たとえば、次のように書ける。次のコードの min_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
を求めてからは、そこから 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; } }