荣誉击杀「掘金日新计划 · 12 月更文挑战」

87 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

荣誉击杀

链接:ac.nowcoder.com/acm/problem…
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

启明小朋友最近在玩一款卡牌游戏,他很喜欢玩恶魔猎手这个职业。

荣誉击杀:当自身攻击力等于目标血量时会产生额外效果。

启明小朋友目前所有的效果是:荣誉击杀:当对敌方随从造成荣誉击杀时对敌方英雄造成等同于攻击力的伤害。

当前在他面前有1个敌方英雄和n个敌人的随从,第i名敌方随从的血量为hi。

启明小朋友可以进行两次攻击,其中1次必须攻击敌方随从或不攻击,另一次可以攻击敌方随从或敌方英雄。

启明开了挂,可以在任意时间把自身攻击力变为[l,r]之间的任何数。

求启明可以对敌方英雄造成的最高输出。

输入描述:

第一行一个整数n(1=<n<=1e5)

第二行n个整数代表hi(1<=hi<=1e9)

第三行2个整数l,r(1<=l<=r<=1e9)

输出描述:

一个整数,启明可以对敌方英雄造成的最高输出。

示例1

输入

3
1 2 3
1 2

输出

4

说明

第一次攻击随从,攻击力选定为2,攻击2号随从,产生荣誉击杀,对敌方英雄造成2点伤害。第二次直接攻击敌方英雄造成2点伤害。

示例2

输入

3
10 20 30
1 9

输出

9

思路

这个题首先是只有两次机会,如果第一次变化成l,r中间的数,而且刚好等于某个随从的血量,产生荣誉击杀,就可以对英雄造成更大的伤害,第二次肯定就是直接变成r对英雄产生伤害。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[2000010];

signed main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int l,r;
    cin>>l>>r;
    int ans=0;
    int maxn=0;
    for(int i=1;i<=n;i++){
        if(a[i]>=l&&a[i]<=r&&a[i]>maxn)maxn=a[i];
    }
    ans+=maxn;
    ans+=r;
    cout<<ans<<endl;
    return 0;
}