AOJ 0108 Operation of Frequency of Appearance
概要
省略
解法
直前の状態を配列に保持して、それぞれの数を数えて配列を更新し、
直前の状態と比較する。
同じだったら終了。
sは12までだと思ってたけど違うみたい。
制約をちゃんと問題文に書いてほしいなあ。
コード
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) int main() { int n; while (1) { int cnt[13] = { 0 }; cin >> n; if (n == 0) break; REP(i, n) cin >> cnt[i]; int pre[13] = { 0 }; for(int k = 0, f = 1; ; k++, f = 1) { int sum[100] = { 0 }; REP(i, n) { pre[i] = cnt[i]; sum[pre[i]]++; } REP(i, n) { cnt[i] = sum[pre[i]]; if (cnt[i] != pre[i]) f = 0; } if (f) { cout << k << endl; REP(i, n) { if (i < n - 1) printf("%d ", cnt[i]); else printf("%d\n", cnt[i]); } break; } } } return 0; }