สมมุติว่าในโลก LOL มีฮีโร่ชื่อ Teemo และการโจมตีของเขาสามารถทำให้ Ashe ศัตรูของเขาติดพิษได้ สมมติว่าเราได้ให้อนุกรมเวลาที่โจมตีของ Teemo จากน้อยไปมากไปหา Ashe และระยะเวลาการเป็นพิษต่อการโจมตีของ Teemo เราต้องหาเวลาทั้งหมดที่ Ashe อยู่ในสภาพเป็นพิษ เราสามารถสรุปได้ว่า Teemo โจมตีที่จุดเริ่มต้นของจุดเวลาที่กำหนด และทำให้ Ashe อยู่ในสภาพที่เป็นพิษทันที
อินพุตเป็นเหมือน [1,4] และ 2 จากนั้นผลลัพธ์จะเป็น 4 นี่เป็นเพราะ ณ จุดที่ 1 Teemo เริ่มโจมตี Ashe และทำให้ Ashe ถูกวางยาพิษทันที สถานะพิษนี้จะคงอยู่ 2 วินาทีจนถึงจุดสิ้นสุดของเวลาที่ 2 และ ณ จุดที่ 4 Teemo จะโจมตีศัตรูนี้อีกครั้ง และทำให้ Ashe อยู่ในสถานะเป็นพิษเป็นเวลา 2 วินาที ในที่สุดคุณต้องส่งออก 4
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ตั้งค่า ret :=0
- currEnd :=-1
- n :=ขนาดของ t
- สำหรับ i ในช่วง 0 ถึง n – 1
- เริ่มต้น :=t[i], สิ้นสุด :=t[i] + d – 1
- ถ้า currEnd
- มิฉะนั้น ret :=ret + end – currEnd, currEnd :=end
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findPoisonedDuration(vector<int>& t, int d) {
int ret = 0;
int currEnd = -1;
int n = t.size();
for(int i = 0; i < n; i++){
int start = t[i];
int end = t[i] + d - 1;
if(currEnd < start){
ret += end - start + 1;
currEnd = end;
} else {
ret += end - currEnd;
currEnd = end;
}
}
return ret;
}
};
main(){
vector<int> v = {1,4};
Solution ob;
cout << (ob.findPoisonedDuration(v, 2));
} อินพุต
[1,4] 4
ผลลัพธ์
4