Pagini recente » Cod sursa (job #1724777) | Cod sursa (job #974149) | Cod sursa (job #2053388) | Cod sursa (job #1978882) | Cod sursa (job #945658)
Cod sursa(job #945658)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 1000005
#define inf 1<<30
using namespace std;
int d, n, k, lo, hi, mid;
int dp[nmax], v[nmax];
int main() {
ifstream f("zombie.in");
ofstream g("zombie.out");
f>>d>>n>>k;
dp[0] = 0;
for(int i=1; i<=n; i++) {
f>>v[i];
dp[i] = dp[i-1] + 1; //pp. ca omor zombie-ul actual, singur
//trebuie sa gasesc cel mai din stanga zombie care inca se afla pe strada
//adica v[i] - v[j] <= d
//<==> v[j] >= v[i]-d, v[j] = minim
lo = 0;
hi = i;
while(hi - lo > 1) {
mid = lo + (hi-lo) / 2;
if(v[mid] < v[i]-d) lo = mid;
else hi = mid;
}
hi--;
//cout<<"pentru zombie-ul "<<i<<" am gasit zombie-ul "<<hi<<"\n";
dp[i] = min(dp[i], dp[hi] + k);
}
//for(int i=1; i<=n; i++) cout<<dp[i]<<" ";
g<<dp[n]<<"\n";
return 0;
}