題解:AT_abc368_c [ABC368C] Triple Attack

海石竹跃發表於2024-12-06

思路

$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;
} 

相關文章