Atcoder Beginner 092 – C 解题报告

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);

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值