Codeforces Round #521
解いた問題を振り返ります。
A.Frog Jumping
問題概要
以下の操作を k 回実施したときの値を求めよ。
それまで実施した回数の操作が偶数回の場合 現在の値 x に a を足す
それまで実施した回数の操作が奇数回の場合 現在の値 x に -b を足す
制約
考え方
与えられた操作をシミュレーションすればよい。
Submission #45806387 - Codeforces
B.Disturbed People
問題概要
つの要素を持つ数列
が与えられる。
の
なる
について
かつ
である場合は
は良くないとされる。いくつかの
を
にすることで良くない数をなくすとき、
にする必要がある
の最小の数を求めよ。
制約
考え方
なる
が存在する場合は
を
にすることで良くない数をなくすことができる。これは数列を前から見ていき、貪欲に上記の方法を適応すれば変更する最小の数を求めることができる。
Submission #45809657 - Codeforces
C.Disturbed People
問題概要
数列のある要素 が
以外の他の要素の和と一致する時、数列は良い数列という。
つの要素を持つ数列
が与えられる。数列のある
つの要素を除いたときに残りの数列が良い数列になる数列の index をすべて求めよ。
制約
考え方
数列がよい数列になるときはどのような数列であるか考える。するとそのような数列は、数列の最大値を max、数列の要素の和を sum とすると max = sum - max となっている。よって与えられた数列の和と最大値、番目の最大値を予め求めておき、
なる
を除いたときに良い数列になっているか確かめれば良い。
Submission #45815882 - Codeforces
D.Cutting Out
問題概要
つの要素を持つ数列
が与えられる。
の要素をいくつか選択して長さ
の数列
を作る。以下の操作を最大にするような数列
を求めよ。
- 操作
に含まれる各要素を
から
つ除く。
制約
考え方
まず最大の操作の回数を決めたい。これは二分探索で求めることができる。つまり操作の回数を 回としたとき、数列
に含まれる
の出現回数が
回とすると少なくとも
個以上は存在しないといけない。
なるすべての
について、
であるときはより回数を大きくでき、そうでない場合はより小さい
が解の候補になる。このようにして最大回数
回が求まったとする。そのとき
は
個
に含めることができるので、あとはそのうち
個を出力すれば良い。
Submission #45879914 - Codeforces
E.Thematic Contests
問題概要
制約
考え方
数列の要素の出現回数を予め求めておく。降順でソートしておき、前から順番に貪欲に求めることができる。 番目について考える時、
と
の最小値をとると、これらの和は初項
、公比
、項数
の等比数列の和であるから
である。これを
について求めれば良い。