ABC167 B - Easy Linear Programming

はい。早速2問目。 

 

問題: 

1 が書かれたカードが A 枚、0 が書かれたカードが B 枚、 1 が書かれたカードが C 枚あります。

これらのカードから、ちょうど K 枚を選んで取るとき、取ったカードに書かれた数の和として、 ありうる値の最大値はいくつですか。 

 

解き方: 

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