假设原来数组中有c个负数,考虑每次操作中,选择k个负数, n - k个正数进行取反,其中k满足
0 <= k <= min(c, n), 0 <= n - k <= min(m - c, n)
。那么,进行一次操作后,负数个数减少了k个,增加了n - k个。这也意味着,负数从c个变成了
c + n - 2 * k
个。
# 读取输入的整数n,表示数组的长度为2n-1 n = int(input()) # 读取数组a的元素,使用map函数将输入的字符串转换为整数列表 a = list(map(int, input().split()))
# 创建一个新列表b,其中的元素是数组a中每个元素的绝对值,这个列表还要进行排序 b = sorted(abs(x) for x in a)
# 初始化答案变量ans # 如果原数组中包含0或者n是奇数(可以保证经过操作后所有数都为正) if0in a or n & 1: ans = sum(b) # 直接将b中所有元素求和,因为可以使所有元素为正 else: # 统计原数组中负数的个数 neg_c = sum(1for x in a if x < 0) # 如果负数个数为奇数,n为偶数时,无法通过取反操作消除所有负数 if neg_c & 1: ans = sum(b[1:]) - b[0] # 将最小的元素保持为负,其他元素取为正 else: ans = sum(b) # 负数个数为偶数,可以通过操作使所有元素为正
# 读取输入的整数n,表示树的节点数 n = int(input()) # 读取节点的权值,前面加一个0是为了使数组的索引与节点编号对应(节点从1开始编号) a = [0] + list(map(int, input().split()))
# 创建图的邻接表表示,多出的一个用于从1开始索引 g = [[] for _ in range(n + 1)]
# 初始化变量ans,用来记录总的操作次数 ans = 0
# 读取n-1条边的信息,构建无向图 for _ in range(n - 1): x, y = map(int, input().split()) g[x].append(y) g[y].append(x)
defdfs(u, fa): # 初始化子节点权值之和为0 s = 0 # 遍历节点u的所有邻接节点 for v in g[u]: if v == fa: # 跳过父节点,避免回溯 continue # 递归计算子树v的权值和,累加到s上 s += dfs(v, u) # 如果子节点权值之和大于当前节点权值,需要增加当前节点的权值 if s > a[u]: global ans # 使用全局变量ans ans += s - a[u] # 增加的操作次数为子节点权值之和与当前节点权值的差 a[u] = s # 更新当前节点的权值 return s + a[u] # 返回以当前节点为根的子树的总权值