Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5211 | Accepted: 2420 |
Description
Input
Output
Sample Input
3 42 1 3 4 17 73
Sample Output
Scenario #1: 41 0 Scenario #2: 2 1 Scenario #3: 4 6
1 /* 2 题意:根(a,b),则左孩子为(a+b,b),右孩子为(a,a+b) 3 给定(m,n),初试根为(1,1),从(1,1)到(m,n)需要往左子树走几次, 4 往右子树走几次。 5 思路:逆向思维,从(m,n)到(1,1)。 6 给定(m,n),求其父亲,如果m>n,则他父亲是(m-n,n), 7 否则(m,n-m)。 8 代码一: ----TLE 9 #include <iostream> 10 11 using namespace std; 12 13 int main() 14 { 15 int T, a, b, lcnt, rcnt; 16 cin >> T; 17 for(int i = 1; i <= T; ++i) 18 { 19 cin >> a >> b; 20 lcnt = rcnt = 0; 21 while(a != 1 || b != 1) 22 { 23 if(a >= b) 24 { 25 ++lcnt; 26 a -= b; 27 } 28 else 29 { 30 ++rcnt; 31 b -= a; 32 } 33 } 34 cout << "Scenario #" << i << ':' << endl; 35 cout << lcnt << ' ' << rcnt << endl <<endl; 36 } 37 return 0; 38 } 39 40 代码二: 41 用除法代替减法,得到的商即为往左走的次数,最后的m=m%n。 42 n>m时情况类推。 43 需要特别注意的是: 44 如果m>n,m%n == 0 怎么办?因为根(1,1)不可能有0存在,所以特殊处理一下: 45 次数:m/n-1;m=1 46 */ 47 #include <iostream> 48 49 using namespace std; 50 51 int main() 52 { 53 int T, a, b, lcnt, rcnt; 54 cin >> T; 55 for(int i = 1; i <= T; ++i) 56 { 57 cin >> a >> b; 58 lcnt = rcnt = 0; 59 while(a != 1 || b != 1) 60 { 61 if(a >= b) 62 { 63 if(a % b) 64 { 65 lcnt += a/b; 66 a %= b; 67 } 68 else 69 { 70 lcnt += a/b-1; 71 a = 1; 72 } 73 } 74 else 75 { 76 if(b % a) 77 { 78 rcnt += b/a; 79 b %= a; 80 } 81 else 82 { 83 rcnt += b/a-1; 84 b = 1; 85 } 86 } 87 } 88 cout << "Scenario #" << i << ':' << endl; 89 cout << lcnt << ' ' << rcnt << endl <<endl; 90 } 91 return 0; 92 }