1.题意:
有一串智障数组,长度为n,代表你将要按该顺序去的几个智障景点的与0的距离,你的起点为0,而且你最终要回到起点0,由于旅游团过于智障,你并不能开心地把这些景点玩个遍,有n个输出,第i行输出就表示你在没法游玩第i个景点的情况下这段旅途所需要的距离花费,问你这n个花费分别是多少。
2.思路:
记一个sum,表示你把所有景点玩了个遍并回到起点所需的总花费,通过规律不难发现,求总花费代码如下:
for(int i =1; i <= n +1; i++) sum += abs(a[i]- a[i -1]);
所以接下来这n行输出,你只需要把多游玩的第i个景点的多余花费抹除即可,这个操作并不骚,仔细想下,你会发现,你多的这些花费,其实就是,sum减去,没玩到的第i个景点到第i +1个景点的花费t1 = abs(a[i +1]- a[i]),再减去,第i – 1个景点到第i个没玩到的景点的花费t2 = abs(a[i]- a[i -1]),再加上抹除第i个景点以后,第i - 1个景点到第i + 1个经典的新花费,t3 = abs(a[i +1]- a[i -1])。
3.代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int Maxx = 1e5;
int n;
int a[Maxx + 7];
int main() {
while(scanf("%d", &n) != EOF) {
int sum = 0;
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
a[0] = 0;
a[n + 1] = 0;
for(int i = 1; i <= n + 1; i++) sum += abs(a[i] - a[i -1]); //所有花费
for(int i = 1; i <= n; i++) {
int t1 = abs(a[i + 1] - a[i]); //多加的花费,要减掉
int t2 = abs(a[i] - a[i - 1]); //多加的花费,要减掉
int t3 = abs(a[i + 1] - a[i - 1]); //删除后新的花费,要加上
printf("%d\n", sum - t1 - t2 + t3);
}
}
}