두 개의 배열 X와 H가 있다고 가정합니다. 둘 다 N개의 요소를 갖고 있고 다른 두 개의 숫자 D와 A도 있습니다. 이야기에서 은색 여우가 N개의 괴물과 싸우고 있다고 가정해 보겠습니다. 몬스터들이 일렬로 서 있고, i번째 몬스터의 좌표는 X[i], 체력은 H[i]이다. 실버 폭스는 폭탄을 사용하여 몬스터를 공격할 수 있습니다. x 위치에 폭탄을 떨어뜨리면 x - D ~ x + D 범위의 모든 몬스터에게 피해를 줍니다. 체력은 A만큼 감소합니다. 모든 몬스터의 체력이 0일 때 여우가 승리합니다. 우리는 이기기 위해 필요한 최소한의 것을 찾아야 합니다.
따라서 입력이 D =3과 같으면; A =2; X =[1, 5, 9]; H =[2, 4, 2]인 경우 출력은 2가 됩니다. 좌표 4에서 첫 번째 폭탄이 새 체력 값이 [0, 2, 2]인 다음 위치 6에서 모든 체력 값을 [0, 0, 0].
단계
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
Define a large array q Define an array of x and h pairs n := size of X d := D a := A for initialize i := 1, when i <= n, update (increase i by 1), do: num[i].x := X[i - 1] num[i].h := H[i - 1] sort the array num sum := 0 for initialize i := 1, when i <= n, update (increase i by 1), do: q[i] := q[i] + q[i - 1] num[i].h := num[i].h - q[i] * a if num[i].h <= 0, then: Ignore following part, skip to the next iteration p := (if num[i].h mod a is same as 0, then num[i].h / a, otherwise num[i].h / a + 1) tmp := num[i].x + 2 * d sum := sum + p q[i] := q[i] + p l := i, r = n while l < r, do: mid := (l + r + 1) / 2 if num[mid].x <= tmp, then: l := mid Otherwise r := mid - 1 q[l + 1] - = p return sum
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 20;
int n;
int d, a, q[maxn];
struct node{
int x, h;
bool operator<(const node& a) const{
return x < a.x;
}
} num[maxn];
int solve(int D, int A, vector<int> X, vector<int> H){
n = X.size();
d = D;
a = A;
for (int i = 1; i <= n; i++){
num[i].x = X[i - 1];
num[i].h = H[i - 1];
}
sort(num + 1, num + n + 1);
int sum = 0;
for (int i = 1; i <= n; i++){
q[i] += q[i - 1];
num[i].h -= q[i] * a;
if (num[i].h <= 0)
continue;
int p = (num[i].h % a == 0 ? num[i].h / a : num[i].h / a + 1);
int tmp = num[i].x + 2 * d;
sum += p;
q[i] += p;
int l = i, r = n;
while (l < r){
int mid = (l + r + 1) >> 1;
if (num[mid].x <= tmp)
l = mid;
else
r = mid - 1;
}
q[l + 1] -= p;
}
return sum;
}
int main(){
int D = 3;
int A = 2;
vector<int> X = { 1, 5, 9 };
vector<int> H = { 2, 4, 2 };
cout << solve(D, A, X, H) << endl;
} 입력
3, 2, { 1, 5, 9 }, { 2, 4, 2 } 출력
2