読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.149 碁石の移動

問題はこちら
No.149 碁石の移動 - yukicoder

AからBへはできるだけ黒い碁石を、BからAへはできるだけ白い碁石を動かせばよい

int main(){
	int a,b,c,d,e;
	scanf("%d%d%d%*d%d%d",&a,&b,&c,&d,&e);
	d=d>b?d-b:0;
	a-=d;
	//AからBへ移されてしまう白石の数をカウント
	a+=c+d<e?c+d:e;
	//BからAへ移される白石は
	//1回目の操作終了後にBにある白石(c+d)と移す個数(e)のminになる
	printf("%d",a);
	return 0;
}

ちゃちゃっと

a,b,c,d;
main(e){
	scanf("%d%d%d%*d%d%d",&a,&b,&c,&d,&e);
	d-=d>b?b:d;
	a=!printf("%d",c+d<e?a+c:a-d+e);
}

98B

今回は前回前々回のように、for文やmain再帰では縮まない
(途中に読み捨てがある分で既に短い)

16/07/16追記
自明な1Bが残ってた…

a,b,c,d;
main(e){
	scanf("%d%d%d%*d%d%d",&a,&b,&c,&d,&e);
	d-=d>b?b:d;
	a=!printf("%d",a+=c+d<e?c:e-d);
}

97B

16/07/29追記
fmin,fmaxを駆使して1B縮む

d-=d>b?b:d;a+=c+d<e?c:e-d;
d=fmax(d-b,0);a+=fmin(c,e-d);
a+=fmin(c,e-fmax(d-b,0));

ということで96B

a,b,c,d;
main(e){
	scanf("%d%d%d%*d%d%d",&a,&b,&c,&d,&e);
	a=!printf("%d",a+=fmin(c,e-fmax(d-b,0)));
}