ABC085 : AtCoder Beginner Contest 085 の A, B, C, D を解いた。
- A - Already 2018
https://atcoder.jp/contests/abc085/tasks/abc085_a
- 提出: https://atcoder.jp/contests/abc085/submissions/38573476
s[3] = '8';
して出力すれば良い
- B - Kagami Mochi
https://atcoder.jp/contests/abc085/tasks/abc085_b
- 提出: https://atcoder.jp/contests/abc085/submissions/38573522
d.into_iter().collect::<HashSet<_>>().len()
- 並び替えて重複を排除して長さを返す
- よく考えたら並べ替える必要はないので HashSet に入れておしまい
- C - Otoshidama
https://atcoder.jp/contests/abc085/tasks/abc085_c
- 提出: https://atcoder.jp/contests/abc085/submissions/38573615
N <= 2000
なので全探索するとO(N^3)
で間に合わないx + y + z = N
なので、x
とy
が決まればz
も決まる- これで
O(N^2)
で間に合う - あとはそれらのすべての組み合わせを試せば良い
- D - Katana Thrower
https://atcoder.jp/contests/abc085/tasks/abc085_d
- 提出: https://atcoder.jp/contests/abc085/submissions/38573781
a_i
だけで考えると、何回でも振れるのでa_i
のうち最大のものを振り続ければ良く、それ以外のa_i
は不要- 最大の
a_i
をmax_a
とする b_i
のうちb_i <= max_a
であればmax_a
を振るほうが良いのでb_i > max_a
以外のb_i
は不要b_i
は 1 度しか振れないので降順に 1 回ずつ振っていくH
以上になればそこで振った数を表示して終わる- すべてを振っても
H
以上にならなければ、あとはmax_a
を振る - このときループではなく切り上げで計算することに注意 (
max_a = 1
でb_i = 1
でH <= 10^9
のような場合に間に合わなくなる)
use proconio::input; fn main() { input! { n: usize, h: usize, ab: [(usize, usize); n], }; let max_a = ab.iter().copied().map(|(a, _)| a).max().unwrap(); let mut bs = ab .iter() .copied() .filter(|&(_, b)| b > max_a) .map(|(_, b)| b) .collect::<Vec<usize>>(); bs.sort(); let mut count = 0_usize; let mut sum = 0_usize; for b in bs.into_iter().rev() { count += 1; sum += b; if sum >= h { println!("{}", count); return; } } let ans = count + (((h - sum) + max_a - 1) / max_a); println!("{}", ans); }
Rustオープン社内勉強会 初心者歓迎 覗き見OK! https://nifty.connpass.com/event/273207/ に参加した。
予備の Corne Chocolate を買った。散財。
お好み焼きを食べた。
今日のコミット。
- rust-sandbox 1 commit
- rust-atcoder 1 commit