5 条题解

  • 3
    @ 2026-2-28 12:02:26

    不是老弟,想要题解,给我自己写🤣

    • 2
      @ 2026-3-22 17:39:01

      问题分析

      本题核心是枚举所有满足 i<j 的数对,并统计其中符号相同的数对数量。题目明确要求使用嵌套循环枚举,因此无需优化算法(n≤1000,嵌套循环时间复杂度 O(n²)=10⁶,完全符合时间限制)。

      关键要点:

      1. 数对条件:i < ja[i]a[j] 符号相同;
      2. 符号分类:
        • 正数:a > 0
        • 负数:a < 0
        • 零:a = 0
      3. 嵌套循环逻辑:外层循环遍历 i(0~n-2),内层循环遍历 j(i+1~n-1),逐个判断条件并计数。

      完整C++代码实现

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      int main() {
          int n;
          cin >> n;
          
          vector<int> nums(n);
          for (int i = 0; i < n; ++i) {
              cin >> nums[i];
          }
          
          int count = 0; // 统计符合条件的数对数量
          
          // 嵌套循环枚举所有i < j的数对
          for (int i = 0; i < n; ++i) { // 外层循环:第一个数的索引i
              for (int j = i + 1; j < n; ++j) { // 内层循环:第二个数的索引j(j > i)
                  // 判断两个数的符号是否相同
                  bool same_sign = false;
                  // 情况1:都是正数
                  if (nums[i] > 0 && nums[j] > 0) {
                      same_sign = true;
                  }
                  // 情况2:都是负数
                  else if (nums[i] < 0 && nums[j] < 0) {
                      same_sign = true;
                  }
                  // 情况3:都是零
                  else if (nums[i] == 0 && nums[j] == 0) {
                      same_sign = true;
                  }
                  
                  // 符号相同则计数+1
                  if (same_sign) {
                      count++;
                  }
              }
          }
          
          cout << count << endl;
          
          return 0;
      }
      

      代码详细解释

      1. 输入处理

      int n;
      cin >> n;
      vector<int> nums(n);
      for (int i = 0; i < n; ++i) {
          cin >> nums[i];
      }
      
      • 读取序列长度 n,并用 vector<int> 存储序列中的数字,索引从 0 开始(符合题目中 0≤i<j<n 的要求)。

      2. 嵌套循环枚举数对

      for (int i = 0; i < n; ++i) {
          for (int j = i + 1; j < n; ++j) {
              // 判断符号是否相同并计数
          }
      }
      
      • 外层循环 i:遍历第一个数的索引(0 ~ n-1);
      • 内层循环 j:遍历第二个数的索引,且 j 必须大于 i(保证 i<j),范围是 i+1 ~ n-1
      • 这种遍历方式能覆盖所有 i<j 的数对,且不会重复(如 (i,j) 和 (j,i) 不会被重复统计)。

      3. 符号相同判断

      bool same_sign = false;
      if (nums[i] > 0 && nums[j] > 0) {
          same_sign = true;
      }
      else if (nums[i] < 0 && nums[j] < 0) {
          same_sign = true;
      }
      else if (nums[i] == 0 && nums[j] == 0) {
          same_sign = true;
      }
      
      • 分三种情况判断符号相同:
        1. 两个数都大于 0(正数);
        2. 两个数都小于 0(负数);
        3. 两个数都等于 0;
      • 只要满足其中一种情况,same_sign 设为 true,否则为 false

      4. 计数与输出

      if (same_sign) {
          count++;
      }
      // 循环结束后输出结果
      cout << count << endl;
      
      • 每找到一对符号相同的数对,计数器 count 加 1;
      • 最终输出计数器值,即符合条件的数对总数。

      测试用例验证

      样例1

      输入:

      5
      1 -2 3 -4 5
      

      序列:[1, -2, 3, -4, 5] 枚举所有 i<j 的数对并判断: | i | j | 数对 | 符号是否相同 | 计数 | |---|---|------|--------------|------| | 0 | 1 | (1,-2) | 否 | 0 | | 0 | 2 | (1,3) | 是 | 1 | | 0 | 3 | (1,-4) | 否 | 1 | | 0 | 4 | (1,5) | 是 | 2 | | 1 | 2 | (-2,3) | 否 | 2 | | 1 | 3 | (-2,-4) | 是 | 3 | | 1 | 4 | (-2,5) | 否 | 3 | | 2 | 3 | (3,-4) | 否 | 3 | | 2 | 4 | (3,5) | 是 | 4 | | 3 | 4 | (-4,5) | 否 | 4 | 最终输出 4,与样例一致。

      样例2

      输入:

      4
      -1 -2 3 4
      

      序列:[-1, -2, 3, 4] 符合条件的数对:

      • (0,1):(-1,-2) → 符号相同;
      • (2,3):(3,4) → 符号相同; 总计 2 个,输出 2,与样例一致。

      边界情况测试

      • n=1:输入 1 5 → 无 i<j 的数对,输出 0
      • 全零序列:输入 3 0 0 0 → 数对 (0,1)、(0,2)、(1,2) 均符合,输出 3
      • 正负交替:输入 4 1 -1 1 -1 → 符合条件的数对:(0,2)、(1,3),输出 2

      总结

      1. 核心逻辑:严格按照题目要求使用嵌套循环枚举所有 i<j 的数对,逐对判断符号是否相同并计数;
      2. 关键细节
        • 内层循环 ji+1 开始,保证 i<j
        • 符号判断需覆盖“正数、负数、零”三种情况;
      3. 效率分析:n≤1000 时,嵌套循环最多执行 1000×999/2 ≈ 5×10⁵ 次,远低于时间限制(1000ms 可执行约 10⁸ 次操作),效率完全满足要求。
      • 1
        @ 2026-4-9 21:08:56

        g

        • 1
          @ 2026-4-9 19:34:48

          what are you doing here?

          • 0
            @ 2026-5-10 20:20:31

            d

            • 1

            信息

            ID
            600
            时间
            1000ms
            内存
            256MiB
            难度
            3
            标签
            递交数
            24
            已通过
            5
            上传者