1 条题解

  • 0
    @ 2026-4-2 21:27:27

    一、题目重述(含符号定义) 我们有一个整数序列,长度为 nn,记为:a1,a2,a3,,ana1,a2,a3, …, an 要求计算交替和,规则是:

    11 个元素(奇数位置)取 正号;

    22 个元素(偶数位置)取 负号;

    33 个元素(奇数位置)取 正号;

    44 个元素(偶数位置)取 负号;

    … 依此类推。

    用数学公式表示就是: S=a1a2+a3a4++(1)i1ai++(1)i1anS=a1​−a2+a3−a4+⋯+(-1)^{i-1}ai+⋯+(-1)^{i-1}an

    其中 (1)i1(-1)^{i-1} 的作用:当 ii 为奇数时 (1)偶数=1(-1)^{\text{偶数}}=1,当 ii 为偶数时 (1)奇数=1(-1)^{\text{奇数}}=-1

    二、输入输出格式(逐项解释) 输入格式 第一行:一个整数 tt,表示测试用例的数量。 约束:1t1041 \le t \le 10^4

    接下来依次输入每个测试用例:

    每个测试用例的第一行:一个整数 nn,表示该序列的长度。 约束:1n1051 \le n \le 10^5

    每个测试用例的第二行:nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n,用空格分隔。 约束:ai109|a_i| \le 10^9

    附加保证:所有测试用例的 nn 之和不超过 10510^5。 (这个保证很重要,它意味着我们可以在 O(n)O(\sum n) 的时间内完成所有计算,而不会超时。)

    输出格式 对于每个测试用例,输出一行一个整数:该序列的交替和 SS

    三、样例详解 样例输入 texttext 22 44 11 22 33 44 33

    1010 5-5 77 样例输出

    texttext

    2-2

    2222

    第一个测试用例 n=4n=4,序列为 [1,2,3,4][1, 2, 3, 4]

    i=1i=1(奇数)→ +1+1

    i=2i=2(偶数)→ 2-2

    i=3i=3(奇数)→ +3+3

    i=4i=4(偶数)→ 4-4

    计算: S=12+34=(12)+(34)=(1)+(1)=2S=1−2+3−4=(1−2)+(3−4)=(−1)+(−1)=−2 输出 2-2

    第二个测试用例 n=3n=3,序列为 [10,5,7][10, -5, 7]

    i=1i=1(奇数)→ +10+10

    i=2i=2(偶数)→ (5)=+5-(-5) = +5 注意:减去一个负数等于加上它的绝对值。

    i=3i=3(奇数)→ +7+7

    计算:

    S=10(5)+7=10+5+7=22S=10−(−5)+7=10+5+7=22 输出 2222

    四、解题思路(由浅入深) 4.1 最直观的想法 按照题目描述,从头到尾遍历数组,用一个变量sum sum 记录当前累加结果。 遇到第 11 个、第 33 个、第 55 个……元素就加上它,遇到第 22 个、第 44 个、第 66 个……元素就减去它。

    4.2 数学抽象 定义符号函数:

    $\text{sign}(i) \triangleq \begin{cases} +1, & i \text{ 为奇数} \\ -1, & i \text{ 为偶数} \end{cases} $

    S=i=1nsign(i)aiS = \sum_{i=1}^n \text{sign}(i) \cdot a_i

    4.3 编程中的下标处理 在 C++ 等编程语言中,数组下标通常从 00 开始。 若我们用 intx=a[i];int x = a[i]; 访问数组,其中ii00n1n-1,那么:

    i==0i == 0 时,对应原始序列的 a1a_1(奇数位置) → 应该加 x。

    i==1 i == 1 时,对应 a2a_2(偶数位置) → 应该减 x。

    i==2 i == 2 时,对应 a3a_3(奇数位置) → 应该加 x。

    判断条件:如果ii % 22 == 00 则加,否则减。

    4.4 算法步骤(伪代码) texttext 读入tt 循环 tt 次: 读入 nn sum=0sum = 0 循环 ii00 n1 n-1: 读入 xx 如果 ii 是偶数: sum=sum+xsum = sum + x 否则: sum=sumxsum = sum - x 输出 sumsum 五、复杂度分析 时间复杂度:每个元素被处理一次,所有测试用例的元素总数为 n105\sum n \le 10^5,因此总操作次数为 O(n)O(\sum n)。 对于每个元素只做常数次加减和判断,所以总体 O(105)O(10^5) 级别,非常快。

    空间复杂度:除了存储输入数据(我们其实可以边读边处理,不需要保存整个数组),只用了几个整型变量:t,n,i,x,sumt, n, i, x, sum。 因此额外空间为 O(1)O(1)

    • 1

    信息

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