h660 - 躲避球 (DodgeBall)
題目描述
題目描述一個躲避球的遊戲情境。初始時,玩家位於一個位置 ans。有多個球以不同的速度 s 從不同的位置 x 投擲過來。玩家可以移動到球的位置,如果球的速度小於或等於玩家的速度 v。如果球的速度大於玩家的速度,玩家會向左或向右移動一段距離(15),具體方向取決於球的位置與玩家的位置關係。目標是計算玩家最終的位置。
解題思路
這題的解題思路是模擬躲避球的過程。對於每一個投擲過來的球,判斷球的位置是否在玩家的躲避範圍內(距離小於等於 d)。如果在躲避範圍內,再判斷球的速度是否小於等於玩家的速度。如果球的速度小於等於玩家的速度,則玩家移動到球的位置。如果球的速度大於玩家的速度,則玩家根據球的位置向左或向右移動 15 個單位。最終,玩家的位置就是答案。
複雜度分析
- 時間複雜度: O(b),其中 b 是投擲球的數量。因為程式碼需要遍歷每一個球。
- 空間複雜度: O(1),程式碼只使用了常數個變數。
程式碼
#include <iostream>
using namespace std;
int ans,d,v,b,x,s;
int main(){
cin >> ans >> d >> v >> b;
for(int i=0;i<b;++i){
cin >> x >> s;
if(abs(ans-x)<=d){
if(s<=v){
ans=x;
}
else{
if(x>=ans){
ans-=15;
}
else{
ans+=15;
}
}
}
}
cout << ans;
}