USTC OJ — 1002 Analyzing algorithm(模拟题,简单题)
1. 题目描述
本题定义了一种游戏规则:
对任意n(n ≥ 1),执行下面算法:
1 input n 2 print n 3 if n = 1 then STOP 4 if n is even then n = n / 2 5 else n = n * 3 + 1 6 GOTO 2
题目保证所给的n在 0 < n < 1,000,000范围内,并且已经证实:对于该范围内的n,执行上述算法都可以在有限步S(n)之后停止。
问题:任意给两个整数i, j,对于[i, j]之间的所有整数n,求出Max(S(n))。
2. 算法设计
贪心模拟即可。
遍历[i, j],对每一个整数n,按照题目所给算法模拟执行,纪录下其执行步数S(n),然后利用S(n)更新当前的max_steps。
3. AC Code
1 /********** 2 *RunId: 87390 3 *Author: nuppt 4 ***********/ 5 #include <stdio.h> 6 void ac_fun(int i, int j, int flag); 7 void swap(int* i, int* j, int* flag); 8 int func(int n); 9 int main() 10 { 11 int i, j, flag = 0; 12 //freopen("in.txt", "r", stdin); 13 while(scanf("%d %d", &i, &j) != EOF) 14 { 15 swap(&i, &j, &flag); 16 ac_fun(i, j, flag); 17 } 18 return 0; 19 } 20 void swap(int* i, int* j, int* flag) 21 { 22 int t; 23 if (*i > *j) 24 { 25 t = *i; 26 *i = *j; 27 *j = t; 28 *flag = 1; 29 } 30 } 31 void ac_fun(int i, int j, int flag) 32 { 33 int k; 34 int max = 0; //记录当前最大长度 35 int sum; 36 for (k = i;k <= j;k++) 37 { 38 sum = func(k); 39 if (sum > max) max = sum; 40 } 41 if (flag) 42 printf("%d %d %d\n", j, i, max); 43 else printf("%d %d %d\n", i, j, max); 44 } 45 int func(int n) 46 { 47 int s = 0; 48 while(1 != n) 49 { 50 if (0 == n%2) n = n/2; 51 else n = n*3 + 1; 52 s++; 53 } 54 return s+1; 55 }
浙公网安备 33010602011771号