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