求大神帮我看看这个代码有什么问题吗

📅 2026/7/27 3:27:35 👁️ 阅读次数 📝 编程学习
求大神帮我看看这个代码有什么问题吗

20 数学奇才

【难度: 简单,标签: 贪心,通过率: 71.6%】

20.1 问题描述

你是一位数学奇才,但却被困在了神秘的数字王国中。在你面前,摆放着一串神奇的数字,它们组成了一个长度为 n 的序列,记作 a。你的使命是利用你特殊的能力,最大化序列中所有数字的总和,但是有一个限制:你只能进行不超过 n 次操作^{20}。

那么,你的特殊能力是什么呢?嗯,你可以选择序列中的某一段连续的数字,然后将它们变为自身的相反数。举个例子,假设你选择了位置 i,那么 a_1,a_2,\dots,a_i 中的每个数字都会乘以 -1。

^{20}参见https://www.lanqiao.cn/problems/16991/learning/?page=5&first_category_id=1&second_category_id=15

现在,你需要巧妙运用你的能力,设计一种操作方案,使得经过不超过 n 次操作后,序列 a 中所有数字的总和尽可能大。请计算出这个最大的总和是多少?!

20.2 输入格式

第一行包含一个整数 n,表示序列 a 的长度 (1 \le n \le 10^5)。

第二行包含 n 个整数 a_1,a_2,\dots,a_n,表示序列 a 中的元素 (-10^9 \le a_i \le 10^9)。

20.3 输出格式

输出一个整数,表示经过不超过 n 次操作后,序列 a 中所有数字的最大总和。

20.4 样例输入

plaintext

3

-1 -2 3

20.5 样例输出

plaintext

6

20.6 样例说明

一种最优的操作方案是:选择位置2,将序列变为 [1,2,3]。这样一来,序列中所有数字的总和为 1+2+3=6,显然,不会有比这更大的数字总和了。

20.7 评测数据规模

对于所有测评数据,1 \le n \le 10^5,-10^9 \le a_i \le 10^9。

#include <stdio.h>

#include <stdlib.h>

long long maxsum(int n, int a[]) {

for (int i = n - 1; i >= 0; i--) {

if (a[i] < 0) {

for (int j = 0; j <= i; j++) {

a[j] = -a[j];

}

}

}

long long sum = 0;

for (int i = 0; i < n; i++) {

sum += a[i];

}

return sum;

}

int main() {

int n;

scanf("%d", &n);

int *a = (int *)malloc(n * sizeof(int));

for (int i = 0; i < n; i++) {

scanf("%d", &a[i]);

}

long long ans = maxsum(n, a);

printf("%lld\n", ans);

free(a);

return 0;

}这个代码对吗?能保证操作次数不超过n吗