思路
$N$ 很大,導致 $T$ 可能也會很大,所以一遍一遍的模擬就會超時。我們發現,題中有一個要求:每次必須打離自己最近的活著的敵人。我們就只用列舉每個敵人即可,在列舉的過程中計算答案。
細節處理
這道題有點難度,因為 $T$ 是 $3$ 的倍數時能量會變成 $3$ 。這是個週期問題,自然會想到除法。但是要注意到底什麼時候它的能量會變成 $3$ ! 是 $T$ 為 $3$ 的倍數,不是這個敵人攻擊了三的整數倍數次!
程式碼
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n, a[200010];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
long long cnt = 0;
for (int i = 1; i <= n; i++)
{
int k = a[i] / 5;
int x = cnt % 3;
cnt += 1LL * k * 3;
k = a[i] % 5;
if (!k) continue;
if (x == 0)
{
if (k <= 2) cnt += k;
else cnt += 3;
}
else if (x == 1)
{
if (k <= 1) cnt++;
else cnt += 2;
}
else if (x == 2)
{
if (k <= 3) cnt++;
else cnt += 2;
}
}
cout << cnt << endl;
return 0;
}