多多在一维数轴上玩一个“传送门”游戏:
在多多使用完全部 n 个传送门后,我们希望知道:
多多与初始位置 x=0 的最远距离可以是多少?
核心思路可以归纳为一句话:
最终能够达到的最大距离,其实就是所有传送值绝对值的总和。
下面给出简要推导/解释:
因此,无论 ai 是正是负,都可以在合适的时机(或顺序)使用一次翻转技能,使得最终的结果是:
i=1∑n∣ai∣#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long ans = 0; // 用long long防止溢出
for (int i = 0; i < n; i++) {
long long x;
cin >> x;
ans += llabs(x); // 累加绝对值
}
cout << ans << "\n"; // 输出最终结果
return 0;
}
n = int(input().strip()) # 第一次输入,用来读取 n
numbers = list(map(int, input().split())) # 第二次输入,一次读取所有 n 个整数
ans = sum(abs(x) for x in numbers) # 对每个数字取绝对值后累加
print(ans)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long ans = 0; // 用long来累加绝对值
for(int i = 0; i < n; i++){
long x = sc.nextLong();
ans += Math.abs(x);
}
System.out.println(ans);
}
}
多多在玩一个传送门游戏。
游戏开始时多多在一维数轴的x=0处。他有n个传送门,每个传送门都有一个传送值ai,他能
使用该传送门从x=t位置传送到x=t+ai,传送门是消耗品,只能使用一次。同时他还有一 个“反转”技能,使用该技能可以立即从位置x=t“反转”到x=−t.
多多可以以任意顺序使用这些传送门,可以在任何时候使用“反转”技能(最多用一次,也可以不 用),问用完所有传送门后,多多到初始位置x=0最远的距离为多少?
第一行为一个正整数n(1≤n≤105),
第二行为n个整数 a1,a2,….,an(−104≤ai≤104)。
输出用完所有传送门后,多多到初始位置距离的最大值。
对于 60 的数据,1≤n≤10;
对于100% 的数据,1≤n≤105,−104≤ai≤104.
输入
4
1 -2 3 -4
输出
0 1 2 4 4
说明
最初多多在位置x=0处;
他先选择使用第2,4个传送门,到达位置x=0+a2+a4=0−2−4=−6;
然后他使用技能“反转”,到达位置x=6;
最后选择第1,3个传送门,到达位置x=6+a1+a3=6+1+3=10,与初始位置距离最大为10。