メモ

yukicoderでゆるふわgolf

yukicoder No.598 オーバーフローファンタジー

問題はこちら
No.598 オーバーフローファンタジー - yukicoder

攻撃し続けてHPを0以下にするか、回復し続けて2^(N-1)以上にするかのどちらか。
よって求めるべきはmin( ceil(X/A) , ceil((2^(N-1)-X)/B) )
ここで一般にx,y>0に対し、ceil(x/y)=1+floor((x-1)/y)なので、単なる整数除算で計算できる

#define min(p,q)(p<q?p:q)
main(){
	int n,x,a,b,s1,s2;
	scanf("%d%d%d%d",&n,&x,&a,&b);
	s1=1+(x-1)/a;
	s2=1+((1L<<(n-1))-x)/b;
	printf("%d",min(s1,s2));
}

ぎゅっとするだけ

main(n,x,a,b){
	scanf("%d%d%d%d",&n,&x,&a,&b);
	printf("%d",a=1+fmin(~-x/a,((1L<<n-1)+~x)/b));
}

91B