1 条题解
-
0
一、题目重述(含符号定义) 我们有一个整数序列,长度为 ,记为: 要求计算交替和,规则是:
第 个元素(奇数位置)取 正号;
第 个元素(偶数位置)取 负号;
第 个元素(奇数位置)取 正号;
第 个元素(偶数位置)取 负号;
… 依此类推。
用数学公式表示就是:
其中 的作用:当 为奇数时 ,当 为偶数时 。
二、输入输出格式(逐项解释) 输入格式 第一行:一个整数 ,表示测试用例的数量。 约束:。
接下来依次输入每个测试用例:
每个测试用例的第一行:一个整数 ,表示该序列的长度。 约束:。
每个测试用例的第二行: 个整数 ,用空格分隔。 约束:。
附加保证:所有测试用例的 之和不超过 。 (这个保证很重要,它意味着我们可以在 的时间内完成所有计算,而不会超时。)
输出格式 对于每个测试用例,输出一行一个整数:该序列的交替和 。
三、样例详解 样例输入
样例输出
第一个测试用例 ,序列为 。
(奇数)→
(偶数)→
(奇数)→
(偶数)→
计算: 输出 。
第二个测试用例 ,序列为 。
(奇数)→
(偶数)→ 注意:减去一个负数等于加上它的绝对值。
(奇数)→
计算:
输出 。
四、解题思路(由浅入深) 4.1 最直观的想法 按照题目描述,从头到尾遍历数组,用一个变量记录当前累加结果。 遇到第 个、第 个、第 个……元素就加上它,遇到第 个、第 个、第 个……元素就减去它。
4.2 数学抽象 定义符号函数:
$\text{sign}(i) \triangleq \begin{cases} +1, & i \text{ 为奇数} \\ -1, & i \text{ 为偶数} \end{cases} $
则
4.3 编程中的下标处理 在 C++ 等编程语言中,数组下标通常从 开始。 若我们用 访问数组,其中从 到 ,那么:
当 时,对应原始序列的 (奇数位置) → 应该加 x。
当时,对应 (偶数位置) → 应该减 x。
当时,对应 (奇数位置) → 应该加 x。
…
判断条件:如果 % == 则加,否则减。
4.4 算法步骤(伪代码) 读入 循环 次: 读入 循环 从 到: 读入 如果 是偶数: 否则: 输出 五、复杂度分析 时间复杂度:每个元素被处理一次,所有测试用例的元素总数为 ,因此总操作次数为 。 对于每个元素只做常数次加减和判断,所以总体 级别,非常快。
空间复杂度:除了存储输入数据(我们其实可以边读边处理,不需要保存整个数组),只用了几个整型变量:。 因此额外空间为 。
- 1
信息
- ID
- 6252
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者