算法分析与设计课程01——495. Teemo Attacking

一、题目描述(中文)原题链接
在LLP的世界里,有一个名叫Teemo的英雄,他的攻击可以让他的敌人Ashe陷入中毒的状态。现在,我们将给出Teemo对Ashe发起攻击的时间点的上升序列,以及每次攻击后Ashe中毒状态持续的时间,你需要输出Ashe处于中毒状态的时间总和。

假设Teemo的攻击发起在每个时间点的最开端,并且在发起攻击时便立刻使Ashe陷入中毒状态。

例1:

输入:[1.4],2
输出:4
解释:在第1个时间单位,TeemoAshe发起进攻,并使Ashe立刻处于中毒状态。Ashe的这种中毒状态将持续2个时间单位,直到第2个时间单位结束,中毒状态结束。
在第4个时间单位,Teemo再次对Ashe发起进攻,使Ashe再次陷入持续2个时间单位的中毒状态中。
所以,你最终输出的结果是4。

例2

输入:[1,2],2
输出:3
解释:在第1个时间单位,TeemoAshe发起攻击并使Ashe立刻处于中毒状态。Ashe的这种中毒状态将持续2个时间单位,直到第2个时间单位结束,中毒状态结束。
然而,在第2个时间单位一开始,Teemo便对已经处在中毒状态的Ashe再次发起了攻击。
中毒状态不会叠加,不过第二次攻击对Ashe带来的中毒作用仍然会在第2个时间单位开始,Ashe的中毒状态将会在第3个时间单位结束时结束。
所以,你最终输出结果是3。

二、题目分析
按照输入的数组我们能将之看成一个时间轴上有几个攻击点,如下图所示:
这里写图片描述

如果在时间点1攻击,在时间点4再攻击,中毒时间为2,4-1=3,那就意味着,在时间间隔1~4里:

3(间隔时间)>2(中毒时间),所以在时间点4再攻击,这个间隔计入中毒时间为2。

同样的思路:
如果在时间点1攻击,在时间点2在攻击,中毒时间为2,所以在时间间隔1~2里:

2-1=1,1(间隔时间)<2(中毒时间),计入中毒时间为1。

三、代码实现(细节问题已写在注释里)

#include <iostream>
using namespace std;

int main()
{
    /*  输入攻击次数:attack_num
        输入攻击时间序列:attack_series
        输入中毒时间:duration 
    */ 
    int attack_num = 0;
    cin >> attack_num;
    int* attack_series = new int[attack_num];
    for(int i = 0; i < attack_num; i ++)
        cin >> attack_series[i];
    int duration = 0;
    cin >> duration;

    //  中毒时间总和:poison_time 
    int poison_time = 0; 
    if(attack_num == 1)
    //  特殊情况:attack_num = 1时,由于只进行一次攻击,所以中毒时间为duration
        poison_time = duration;
    else if(attack_num == 0)
    //  特殊情况:attack_num = 0时,由于只进行一次攻击,所以中毒时间为0
        poison_time = 0;
    else{
        //  一般情况 
        for(int i = 0; i < attack_num - 1; i ++)
        {
            int d = attack_series[i + 1] - attack_series[i];
            if(d >= duration)
                poison_time = poison_time + duration;
            else
                poison_time = poison_time + d;
        }
        //最后一个时间点攻击后,中毒时间恒为duration
        poison_time = poison_time + duration;
    }
    cout << poison_time;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值