1 条题解

  • 0
    @ 2025-4-8 21:04:01

    问题分析

    本题的目标是找到最小的自然数 NN,使得在 11NN 这些自然数前添加正号或者负号后,它们的代数和能够等于给定的正整数 SS

    核心思路

    11. 计算总和:首先,考虑从 11NN 的所有自然数相加的和,根据等差数列求和公式,其总和 sumsumsum=N×(N+1)2sum=\frac{N\times(N + 1)}{2}。例如,当 N=3N = 3 时,sum=1+2+3=3×(3+1)2=6sum = 1+2 + 3=\frac{3\times(3 + 1)}{2}=622. 符号改变的影响:当把 11NN 中某个数 kk 前面的符号从正号变为负号时,总和的变化量是 2k2k。这是因为原本是加 kk,现在变成减 kk,相当于总和减少了 2k2k。比如,若原本是 1+2+3=61 + 2+3 = 6,把 22 前面的符号变为负号,就变成了 12+3=21-2 + 3 = 2,总和减少了 2×2=42\times2 = 4。由此可知,改变符号后总和的变化量一定是偶数。 33. 判断条件:要使得 11NN 这些数通过添加正负号后能得到和 SS,那么 sumSsum - S 必须是非负偶数。因为 sumsum 是所有数都取正号时的和,当我们改变某些数的符号后得到和 SSsumSsum - S 就是改变符号导致的总和变化量,而这个变化量必然是偶数,同时它不能是负数。

    具体步骤

    11. 初始化:令 NN11 开始,NN 代表当前考虑的最大自然数。 22. 计算总和:计算从 11NN 的所有自然数的和 sum=N×(N+1)2sum=\frac{N\times(N + 1)}{2}33. 条件判断:检查 sumSsum - S 是否为非负偶数。如果满足 (sumS)0(sum - S)\geq0(sumS)%2==0(sum - S)\%2 == 0,则说明找到了满足条件的最小 NN,停止循环。 44. 递增 NN:如果不满足条件,则将 NN11,继续步骤 2 和步骤 3。

    复杂度分析

    • 时间复杂度:由于是从 11 开始逐步增加 NN,直到满足条件为止。因为 sum=N×(N+1)2sum=\frac{N\times(N + 1)}{2} 近似为 N22\frac{N^2}{2},当 sumSsum\geq S 时停止循环,所以 NN 大约为 2S\sqrt{2S},时间复杂度为 O(S)O(\sqrt{S})
    • 空间复杂度:整个过程只使用了常数级的额外变量,如 NNsumsumSS,所以空间复杂度为 O(1)O(1)
    #include <iostream>
    
    int main() {
        int S;
        std::cin >> S;
    
        int N = 1;
        while (true) {
            int sum = N * (N + 1) / 2;
            if ((sum - S) >= 0 && (sum - S) % 2 == 0) {
                break;
            }
            N++;
        }
    
        std::cout << N << std::endl;
        return 0;
    }    
    
    • 1

    信息

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