ABC167 B - Easy Linear Programming
はい。早速2問目。
問題:
が書かれたカードが 枚、 が書かれたカードが 枚、 が書かれたカードが 枚あります。
これらのカードから、ちょうど 枚を選んで取るとき、取ったカードに書かれた数の和として、 ありうる値の最大値はいくつですか。
解き方:
K枚のうち、Aを最大かつCを最小になるようにカードを選びたい。
まず、A>Kのとき、和は自明にK。
ここで、K>Aのときを考える。A+B>Kであれば、和の最大はAになる。
しかしながらK>A+Bのときには、「-1」であるCが入ってきてしまうのでこれを最小の数だけ取りたい。Cが最小となるのはK枚選ぶうち、AとBを最大数取った残りになるはずなので、K-(A+B)。これをAの枚数から引けばいいのでA-{K-(A+B)}となる。
複雑になったので整理。
・A>K:K
・K>A:A
・K>A+B:A-{K-(A+B)}
これをif文で書いてあげれば良い。
それではコードを書きますね。
Cのコード:
#include <stdio.h>
int main (void){
int a, b, c, k;
scanf("%d%d%d%d", &a,&b,&c,&k);
if(k-a>0){
if(k-a-b>0){
printf("%d", a-(k-a-b));
}else printf("%d", a);
}else printf("%d", k);
return 0;
}
結構シンプルに行けましたね。これが最適な解法なのかはわからないですけども...
Python:
a, b, c, k = map(int, input().split())
if k-a>0:
if k-a-b>0:
print(a-(k-(a+b)))
else: print(a)
else: print(k)
Python IS GOD.....
Bまでは普通に解けるみたいですね。次はCをやってみて面倒臭かったら他のコンテストのBでも解いてみます。
--
owari