题目地址:http://poj.org/problem?id=2499
这题乍一看看不懂题目是什么意思(虽然就那么几句话。。),好不容易看懂了以为是一个很难的题,后来仔细一推发现是个大水题。。因为只要判断n与m哪个大,如果n大则肯定说明n=n+m,肯定是走的左边。反之走的右边。然后就这样模拟,一直模拟到树根(1,1)为止。但是写完后提交。。TLE。。然后突然觉得不是水题。。。后来又一想,发现不是多么难。。可以进行一些优化。比如,当(11,3)的时候,可以直接模拟到(2,3),而当有一个数为1的时候,就可以直接推到树根了。。代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include<algorithm> using namespace std; int main() { int t, n, m, x, y, num=0; scanf("%d",&t); while(t--) { num++; scanf("%d%d",&n,&m); x=y=0; while(n!=1||m!=1) { if(n>m) { if(m==1) { x+=n-1; n=1; continue ; } x+=n/m; n=n%m; } else { if(n==1) { y+=m-1; m=1; continue ; } y+=m/n; m=m%n; } } printf("Scenario #%d:\n%d %d\n\n",num,x,y); } return 0; }