AtCoder Beginners Contest 117の参加記録。
A-Entrance Examination
を満たすを求める.式変形して
解答
fn main() {
let (t, x) = {
let i = read::<f64>();
(i[0], i[1])
};
println!("{}", t / x);
}
B-Polygon
の角形は存在するか.
定理 : 一番長い辺が他の辺の長さの合計よりも真に短い場合に限り、条件を満たす角形が描ける。
から, 最も長い辺とその他の辺の和を比較する.
その他の辺の和は, (全ての辺の和) - (最長辺)とすれば楽.
解答
fn main() {
let _ = read_one::<usize>();
let ln = read::<usize>();
let max = ln.iter().max().unwrap();
let sum = ln.iter().sum::<usize>() - max;
if max < &sum {
println!("Yes");
} else {
println!("No");
}
}
C - Streamline
個の駒と数直線上に個の座標が与えられる. 最初に個の駒を好きな座標に置いてから,
- ある駒を1つ選び, その駒の座標をまたはする
操作を行い, 個全ての座標を訪れる為の操作の最小回数を求める.
初期配置にはコストがかからない.
-90 -10 0 1 4
に対して2つ駒を置くとする. このとき移動コストは以下のようになる.
からに移動する為の操作回数は だから, 移動コストが大きい座標に配置すればその2点間の移動コストが節約できる.
3つ目以降の駒や, 駒を座標の途中に置いた場合でも, 右端からその座標までの移動と, その座標から左端までをそれぞれの駒で行なえばよい.
したがって(駒数 - 1)個分だけ座標間の移動コストを取り除けばよい.
解答
fn main() {
let (n, m) = {
let i = read::<usize>();
(i[0], i[1])
};
let mut xm = read::<isize>();
xm.sort();
let mut cost = Vec::new();
for i in 0..m - 1 {
cost.push((xm[i] - xm[i + 1]).abs() as usize);
}
cost.sort();
for _ in 0..n - 1 { cost.pop(); }
println!("{}", cost.into_iter().sum::<usize>());
}
D - XXOR
桁DPについて復習
とが与えられる.
の最大値を求める.
3 7
1 6 3
上の入力例1 6 3
を2進数で表してみる.
0 1 1 0 # 6
0 0 1 1 # 3
0 0 0 1 # 1
各々とのXORが最大になるようにするには, 各桁で0/1
の少ない方を立てればいい.
所感
Dの方針が立ってから無限にバグらせてた. C迄のスピード感は良かったのでもったいなかった.
http://drken1215.hatenablog.com/entry/2019/02/03/224200 にある
であるとは、上位ビットから見たときにとのビットが初めて一致しなかった桁が であったとしたとき
- より上位の桁については、はと一致
- 桁目についてははで,はである
- より下位の桁についてははなんでもいい
がわかりやすかった. 各桁のビット比較で大小比較が行えればデータをbit列のまま取り扱うことができ, bit - usize間の変換がいらず実装が楽になる.
Comments