配点: 200 点 / 実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 57 / NoviSteps: 6Q
問題概要
空の箱が 個あり、これから
個のボールを数列
に従って箱に入れていく。具体的には、
番目のボールに次の処理を行う。
のとき : このボールを箱
に入れる。
のとき : このボールを、現在入っているボールが最も少ない箱のうち番号が最小である箱に入れる。
それぞれのボールをどの箱に入れたかを求めよ。
制約
- 入力は全て整数
考察
制約が小さいので、 のときも愚直に
for文を使ってボールの個数が最小の箱を見つければよい。
答えを出力するときは、 の箇所を書き換えつつ、配列
の値を順次出力するのが簡単。
実装例
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) constexpr int INF = 1e+9; template <typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } // ======================================== // int main() { int N, Q; cin >> N >> Q; vector<int> X(Q); rep(i, 0, Q) cin >> X[i]; vector<int> boxes(N + 1, 0); rep(i, 0, Q) { if (X[i] >= 1) { boxes[X[i]]++; } else { int idx = -1, cnt = INF; rep(j, 1, N + 1) { if (chmin(cnt, boxes[j])) { idx = j; } } boxes[idx]++; X[i] = idx; } } for (auto &&x : X) { cout << x << " "; } cout << endl; return 0; }
実装時間: 5分
コメント
「問題文の通りに実装する」これも重要な典型(?)。