Loading

Hitachi Vantara Programming Contest 2024(AtCoder Beginner Contest 368)- C

题意概述

\(N\) 个数,分别为 \(H_1,H_2,H_3……H_N\)

你将使用初始化为 \(0\) 的变量 \(T\) 重复以下操作,直到所有数的值都变为 \(0\) 或更少。

  • \(T\) 增加 \(1\) 。然后,减少最前方 \(H_i\) 值大于等于 \(1\) 的值。如果 \(T\)\(3\) 的倍数,\(H_i\) 的值会减少 \(3\) ;否则,\(H_i\) 的值会减少 \(1\)

当所有 \(H_i\) 的值变为 \(0\) 或更少时,求 \(T\) 的值。

思路

先找规律 \(T\) 加的时候两次不是三的倍数,第三次是,根据 \(1 + 1 + 3 = 5\) 那么可得当 \(5 \le H_i\) 时, \(T\) 便增加了 \(\lfloor H_i \div 5 \rfloor \times 3\),然后 \(H_i \bmod 5\),剩下 \(H_i \le 4\) 的情况咱之间暴力求解即可。

代码

#include <bits/stdc++.h>
#define ll long long
#define N 200001
#define mod 998244353
using namespace std;
mt19937_64 mrand(random_device{}());

int n;
ll h[N], t;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &h[i]);
    for (int i = 1; i <= n; i++) {
        if (h[i] >= 5) {
            t += h[i] / 5 * 3;
            h[i] %= 5;
        }
        while (h[i] > 0) {
            t += 1LL;
            if (t % 3)
                h[i]--;
            else
                h[i] -= 3;
        }
    }
    printf("%lld", t);
}
posted @ 2024-08-25 12:52  笙竺  阅读(31)  评论(1)    收藏  举报