2023-02-03 ABC085 の A, B, C, D を解いた
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