题意概述
有 \(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);
}
标签:AtCoder,le,Beginner,Contest,int,ll,值会,define
From: https://www.cnblogs.com/Sliver-jiblogs/p/18378838