小红的踏前斩——贪心

2023-12-24 21:51:31

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

文章来源:https://blog.csdn.net/m0_74403543/article/details/135186459
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。