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 }
View Code

 

posted on 2014-12-11 23:51  nuppt  阅读(319)  评论(0)    收藏  举报

导航