1 条题解

  • 0
    @ 2025-5-5 17:01:13

    题目分析

    我们需要处理的问题涉及对输入数据的遍历和奇偶性判断。虽然题目给出的输入样例中 i<ji < j,但题目并未明确说明 iijj 的大小关系,因此在实现时需要额外考虑 iijj 的相对大小。此外,我们需要高效地判断数字的奇偶性,并正确统计遍历次数。

    解题思路

    1. 输入数据的处理

      • 输入数据中的 iijj 可能存在 i<ji < ji>ji > j 的情况,因此在遍历时需要先判断 iijj 的大小关系。
      • 如果 i>ji > j,则交换 iijj,确保后续遍历始终是从小到大的顺序。
    2. 奇偶性判断

      • 使用位运算快速判断数字的奇偶性:
        • n&1n \& 1 的结果为 11,则 nn 为奇数。
        • 否则,nn 为偶数。
      • 这种方法比取模运算(n%2n \% 2)更高效。
    3. 遍历次数的统计

      • 遍历时需从 00 开始计数,避免因起始值选择错误导致统计偏差。
      • 例如,若需要统计某个区间内的数字个数,应确保循环变量从区间的下限开始。

    关键优化

    • 交换 iijj
      • 在输入后立即检查 iijj 的大小关系,若 i>ji > j,则交换两者的值,确保后续处理的一致性。
    • 位运算优化
      • 使用 n&1n \& 1 代替 n%2n \% 2 判断奇偶性,减少计算时间。
    • 遍历起始点
      • 明确循环变量的起始值(如从 00 开始),避免因起始值错误导致漏算或多算。

    复杂度分析

    • 时间复杂度
      • 判断 iijj 的大小关系并交换:O(1)O(1)
      • 奇偶性判断:O(1)O(1)
      • 遍历区间 [i,j][i, j]O(ji+1)O(j - i + 1)
    • 空间复杂度
      • 仅需存储 iijj 的值,空间为 O(1)O(1)
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    //const int maxn = 100000 + 10;
    
    int panduan(int n)
    {
    	int i;
    	for (i = 0; n != 1; i++){      //注意:如果看循环多少次,都是从0开始算完一遍之后开始计
    		if (n & 1)                 // 判断为奇数
    			n = 3 * n + 1;    
    		else                       // 判断为偶数
    			n = n / 2;
    	}
    	return i+1;
    }
    int main(){
    
    	int i,j;
    	while (cin>>i>>j)                    
    	{
    		int m = min(i, j);
    		int n = max(i, j);
    		int num = 0;
    		for (int a = m; a <= n; a++)
    		{
    			num=max(num, panduan(a));	         // 注意最大值最小值函数如何使用
    		}
    		cout << i << " " << j << " " << num << endl;
    	}
    	return 0;
    }
    • 1

    信息

    ID
    208
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者