题解 - 刷野 II

题目描述

Zayin 是一个与怪物战斗的巫师,这次他将面临 n 个站成一排的怪物,其中第 i 个怪物的生命值是 ai。
Zayin 知道许多被压制的咒语,在这场战斗中,他决定使用一个名为” 闪电连击” 的咒语来一口气击败所有的怪物。让我们看看这个咒语是如何工作的。
• 首先,Zayin 选择一个怪物 i(1 ≤ i ≤ n) 以及咒语的初始力量 x。
• 然后这个咒语会首先击中怪物 i,随后对于除第一个目标怪物外,Zayin 可以选择一个没有被该咒语击中过,并且与其中一个已经被击中的怪物相邻的怪物。
• 第一个被击中的目标怪物会受到 x 的伤害,第二个目标怪物会受到 x−1 的伤害,第三个受到 x−2 的伤害,以此类推。不难看出,每个怪物都会被击中恰好一次。
如果一个怪物受到的伤害不低于其生命值,则视为死亡。
Zayin 想展示他作为一个高级巫师的能力,所以他希望在只使用一次咒语就能杀死所有怪物的前提下,使用最少的初始力量 x。
现在你需要求出所需的最少的初始力量,并给出一个方案。如果有多个不同的方案,只需要给出任意一个就可以了。

输入

第一行包含两个整数 d, n,表示测试点编号和怪物数。
接下来一行 n 个整数,第 i 个整数 ai 表示第 i 个怪物的血量。

输出

第一行输出一个整数 x,表示最少的初始力量。
接下来第二行输出 n 个用空格分割的下标 monsteri(1 ≤ i ≤ n),其中 monsteri 表示第 i 个击中的目标怪物。

样例

样例输入

1 10
19 9 12 5 10 7 16 15 17 12

样例输出

25
1 2 3 4 5 6 7 8 9 10

提示

对于所有测试数据,保证 1 ≤ n ≤ 5 × 1e6, 1 ≤ ai ≤ 1e9。

分析

考虑贪心

两端的怪物一定最后被打,并且肯定是选血量更小的那个后打,

以此类推,就得到了所有的打怪顺序

可以用双指针来实现

代码

#pragma GCC optimize(2)
 
#include<bits/stdc++.h>
 
using namespace std;
 
const int N = 5e6 + 10;
 
int t,n;
int a[N];
int res[N];
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
 
    cin >> t;
     
        cin >> n;
        for(int i = 1;i <= n;i++) cin >> a[i];
         
        int l = 1,r = n,cnt = n,mx = 0;
        while(l <= r){
            if(a[l] < a[r]) res[cnt--] = l,mx = max(mx,a[l++] + cnt);
            else res[cnt--] = r,mx = max(mx,a[r--] + cnt);
        }
 
        cout << mx << '\n';
        for(int i = 1;i <= n;i++) cout << res[i] << ' ';
        cout << '\n';
     
 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值