Pagini recente » Cod sursa (job #2581423) | Cod sursa (job #2825510) | Cod sursa (job #1783167) | Cod sursa (job #2301695) | Cod sursa (job #2822370)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("zombie.in");
ofstream fout("zombie.out");
const int N = 1e6 + 1;
int v[N], dp[N], last[N];
// last[i] = index-ul primului zombie care va ataca daca am face o vraja de tip 2 la timpul zombie-ului i
// dp[i] = minimul de vraji pana la zombie-ul i
// dp[i] = min(dp[i - 1] + 1, dp[last[i] - 1] + k); ori aplicam vraja 1, ori vraja 2
// ^^^^ -1 ,fiindca inclusiv cel de la last[i] va fi eliminat
int main() {
int d, n, k;
fin >> d >> n >> k;
for (int i = 1; i <= n; i++) fin >> v[i];
int p = 1;
for (int i = 1; i <= n; i++) {
while (v[p] + d < v[i]) p++;
last[i] = p;
}
dp[1] = 1;
for (int i = 2; i <= n; i++)
dp[i] = min(dp[i - 1] + 1, dp[last[i] - 1] + k);
fout << dp[n];
return 0;
}