开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}