ABC095 C:Half and Half
https://atcoder.jp/contests/abc095/tasks/arc096_a
だいたいコメントを読んでもらえれば雰囲気は伝わると思う。
signed main() {
int a, b, c, x, y;
cin >> a >> b >> c >> x >> y;
// A, B バラ買いパターン
int n = a * x + b * y;
// A, B のどちらか必要な量を超えるパターン
int m = 2 * c * max(x, y);
// 必要最小限の Cセットを買い、足りない分はバラ買いパターン
int p = x < y ? b : a;
int l = 2 * c * min(x, y) + p * abs(x - y);
// 上記のうちでいっちゃん安いの
int ans = min(n, min(m, l));
cout << ans << endl;
}
Cセットを奇数個買ってもAとBどちらも0.5余って意味ないので、必ず偶数個買うようにする。単位を片方に合わせるという意味で、類題は https://atcoder.jp/contests/agc019/tasks/agc019_a になるか?
見てもらえれば分かる通り、コード中に出てくるパターンは、それぞれ入力・出力サンプルのものと一致している。
難易度のえげつない問題においては知らんが、今のところはこのサンプルに大いに助けられている。要は、テストケースを想像できるだけの能力がまだないということだ。
公式解説によると全探索でもいけるらしい。頭わりいのに定数オーダーの回答を無理やりウンウン捻り出すのは過去問解くぶんには練習になるけど、本番ではあんまり良くないことだろう。ま、いっか。