問題はこちら
No.246 質問と回答 - yukicoder
二分探索(10^9<2^30)
整数の二分探索といえば普通は終了条件high-low>1にして(low,high)を
(low+(high-low)/2,high)か(low,high-(high-low)/2)に更新していくのだけど
d=high-lowとして終了条件をd>0、(low,d)を(low+d/2,d/2)か(low,d/2)に更新していく方が個人的には直感的にわかりやすいので、こちらで実装した
int main(){ int i,d=1<<30,s=0; while(d){ d/=2; printf("? %d\n",s+d); fflush(0); scanf("%d",i); if(i==1)s+=d; } printf("! %d\n",s); return 0; }
printfが2つあるのは冗長に見えるのでなんとかしてまとめたい
ということでループ終了条件をprintf文の後ろに持って行った
d=1<<30,s;main(i){for(;fflush(!printf("%c %d\n",d?63:33,s+(d/=2))),d;s+=i*d)scanf("%d",&i);}
REにはならないらしい
92B