問題はこちら
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