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

メモ

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

yukicoder No.236 鴛鴦茶

問題はこちら
No.236 鴛鴦茶 - yukicoder

コーヒを全部使っても紅茶が足りるならそれが最大
足りないなら逆に紅茶に合わせれば良い

int main(){
	double a,b,x,y;
	scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
	if(x/a*b<=y)printf("%f",x+x/a*b);
	//コーヒーを全部使うときに必要な紅茶の量はx/a*b
	else printf("%f",y+y/b*a);
	return 0;
}

求める答えは
x*b≦y*aのときx+x/a*b=x*(b+a)/a
そうでないときy+y/b*a=y*(b+a)/b
この(a+b)をくくってもくくらなくても長さは同じ
要求精度がゆるいのでfloatでも通る

float x,y;b;main(a){b=scanf("%d%d%f%f",&a,&b,&x,&y)>printf("%f",x*b>y*a?y+y/b*a:x+x/a*b);}
float x,y;b;main(a){b=scanf("%d%d%f%f",&a,&b,&x,&y)>printf("%f",(a+b)*(x*b>y*a?y/b:x/a));}

90B


2016/10/17追記
folat型にするのは長いし、整数の範囲でどうにかならないかなあと式変形

//割り算を1箇所にまとめたいので/a/bを外に出す
(a+b)*(x*b>y*a?y/b:x/a)
(a+b)*(x*b>y*a?y*a:x*b)/a/b
(a+b)*fmin(x*b,y*a)/a/b

fminを使って自然にdoubleに変換できた

b,x,y;main(a){b=scanf("%d%d%d%d",&a,&b,&x,&y)>printf("%f",fmin(y*a,x*b)*(a+b)/a/b);}

84B