Cod sursa(job #945658)

Utilizator harababurelPuscas Sergiu harababurel Data 2 mai 2013 15:17:28
Problema Zombie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#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;
}