您的位置:首页 > 其它

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

2017-02-25 21:52 357 查看
一、题目描述(中文)原题链接

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

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

例1:

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


例2

输入:[1,2],2
输出:3
解释:在第1个时间单位,Teemo对Ashe发起攻击并使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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法