この回はAを凡ミスでTLE、Bだけ解けて微妙な順位。
http://codeforces.com/contest/317/problem/A
問題
2つの整数ペア(X,Y)と整数Mが与えられる。
ペアの片方の要素をX+Yに置き換える、という処理を繰り返し、ペアのどちらかの要素をM以上にしたい。
必要な処理数を最小化せよ。
解法
X,Yの初期値がM以上なら0回で終了。
それ以外の場合:
- X,Yが両方0以下なら値を増やせないのでM以上にできない。
- 少なくとも片方が正なら、小さい方をX+Yで置き換える
2番目のステップで、たとえばX<0、Y>0の場合、Xが正になるまでYを足しこむが、1回ずつやってしまうとTLEするので割り算して一気に処理しないといけない。
両方正なら、毎回小さい方が倍以上になるので、数十回やればMを超える。
ll X,Y,M; void solve() { int f,r,i,j,k,l, x,y; cin>>X>>Y>>M; if(X>Y) swap(X,Y); if(Y>=M) { _P("0\n"); return; } if(Y<M && Y<=0) { _P("-1\n"); return; } ll ret=0; if(X<0) { ret += -X/Y; X += (-X/Y)*Y; } while(Y<M) { ret++; X=X+Y; if(X>Y) swap(X,Y); } cout << ret << endl; }
まとめ
正負の扱いが独特な問題。