Cod sursa(job #638063)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 20 noiembrie 2011 18:34:50
Problema Zombie Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 0.88 kb
#include <cstdio>
#include <fstream>

#define MAXN 1000010
using namespace std;

long long sol;
int D, N, K, A[MAXN], dp[MAXN];
inline int min(int a, int b) {
	if(a < b) return a;
	return b;
}
int main() {

//	freopen("zombie.in", "r", stdin);
//	freopen("zombie.out", "w", stdout);
	ifstream fin("zombie.in");
	ofstream fout("zombie.out");

	fin >> D >> N >> K;

	for(int i = 1; i <= N; i++)
		fin >> A[i];
	for(int i = 1; i <= N; i++)
		dp[i] = 100000000;
	dp[N] = 1;
	int act, antact;
	act = N;
	for(int i = N - 1; i >= 1; i--) {
/*
		for(int j = i; j <= N; j++) {
			dp[i] = min(dp[i], dp[j + 1] + (j - i + 1));
			if(A[j] - A[i] <= D)
				dp[i] = min(dp[i], dp[j + 1] + K);
		}
*/		
		dp[i] = dp[N + 1] + (N - i + 1);
		while(A[act] - A[i] > D) {
			dp[i] = min(dp[i], dp[act + 1] + (act - i + 1));
			--act;
		}

		dp[i] = min(dp[i], dp[act + 1] + K);
	}
	fout << dp[1] << "\n";
	return 0;
}