Terry's Blog

Terry's Blog

我好菜啊

题解 AT3533 【[ABC074B] Collecting Balls (Easy Version)】

posted on 2021-02-21 16:21:00 | under 题解 |

题解 AT3533 【[ABC074B] Collecting Balls (Easy Version)】

这个题面描述居然如此的不友好,那么就重新翻译一下

Description

在平面直角坐标系中有 $n$ 个点,第 $i$ 个点的坐标为 $(i,a_i)$,有点 $(i,k)$ 和 $(i,0)$ 与其对应,求所有的 $i$ 号点与距离其最近的点的距离和的两倍。

Solution

其实这道题非常的简单,可以评红。
对于点 $(i,a_i)$ 来说,和它距离最近的点只能是$(i,k)$ 或 $(i,0)$,对这两个值取最大值就好了,时间复杂度 $\mathcal{O(n)}$。

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 109;

#define gc getchar
inline int read() {
    int c = gc(), t = 1, n = 0;
    while(isspace(c)) { c = gc(); }
    if(c == '-') { t = -1, c = gc(); }
    while(isdigit(c)) { n = n * 10 + c - '0', c = gc(); }
    return n * t;
}
#undef gc

int a[N],n,k,sum;

int main() {
    n = read(); k = read();
    for(int i = 1;i <= n;i++) a[i] = read();
    for(int i = 1;i <= n;i++) sum += min(a[i],k - a[i]);
  // (i,ai)到(i,0)的距离为a,到(i,k)的距离为k-ai
    printf("%d\n",sum * 2);
    return 0;
}