https://atcoder.jp/contests/otemae2019/tasks/otemae2019_c
解説
https://atcoder.jp/contests/otemae2019/submissions/6931000
カード列Bを使って、Ciを何個作れるかという問題であるが、カード列Bは毎回並び替えるので、特に順番は関係ない。
関係あるのは、とあるカードが何枚あるかである。
これを元に考えると、各iでの答えは、すべての数について、ある数が(Bで登場する回数)/(C[i]で登場する回数)の最小値が答えになる。
ここまでくれば、解法自体は簡単。
Bで登場する回数は変わらず、iが増えるごとにC[i]で登場する回数の追加になる数の個数が増えるだけなので、
これを計算して、個数の最小値を更新すると答えになる。
int N, A[101010], B[101010]; int cntA[101010], cntB[101010]; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; rep(i, 0, N) cin >> A[i]; rep(i, 0, N) cin >> B[i]; rep(i, 0, N) cntB[B[i]]++; int ans = inf; rep(i, 0, N) { int a = A[i]; cntA[a]++; chmin(ans, cntB[a] / cntA[a]); printf("%d\n", ans); } }