有 n 个怪物排成一排,第 i 个怪物的血量为 ai。
小红有两个技能可以打怪:
1. 强力攻击,消耗 1 mp,对一只怪物造成1点伤害。
2. 踏前斩,消耗 5 mp,对当前怪物造成 1 点的伤害,同时剑气将波及后两个怪物,对下一个怪物造成 2 点伤害,对下下个怪物造成 3 点伤害。
如果一个怪物受伤后血量小于等于 0,则怪物死亡。死亡后怪物的尸体依然占据一个位置,会被踏前斩的剑气打到。
小红想知道,击杀全部怪物至少需要花费多少mp?
Input
第一行输入一个正整数 n (1 ≤ n ≤ 1e5).
第二行输入 n 个正整数 ai (1 ≤ ai ≤ 1e9).
Output
一个整数,代表花费的mp最小值。
输入1:
5
2 3 4 2 3
输出1:
12
输入2:
6
1 1 2 3 2 3
输出2:
11
样例 1 解释:
对第一个怪和第二个怪分别进行一次强力攻击,此时每只怪物血量为[1,2,4,2,3]
对第一个怪进行一次踏前斩,此时每只怪物血量为[0,0,1,2,3]
再对第三个怪进行一次踏前斩,消灭全部怪物。
总mp消耗为12。
样例 2 解释:
对第二怪进行一次踏前斩后,每只怪物血量为[1,0,0,0,2,3]。
随后对每个怪物进行一次强力攻击。
解析:
从后往前遍历即可,从前向后容易出现前面的影响后面的,从后往前就不会有这种影响。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int n;
int a[N];
signed main()
{
ios;
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
int ans=0;
for (int i=n-2;i>0;i--)
{
int k=min(a[i],min(a[i+1]/2,a[i+2]/3));
ans +=5*k;
a[i] -=k;
a[i+1] -=2*k;
a[i+2] -=3*k;
}
for (int i=1;i<=n;i++) ans +=a[i];
cout<<ans;
return 0;
}