Cod sursa(job #1765909)

Utilizator LegionHagiu Stefan Legion Data 27 septembrie 2016 09:43:22
Problema Zombie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;
int dp[1000001];
int val[1000001];
int d, n, k;
int min(int a, int b)
{
	if (a < b){ return a; }
	else { return b; }
}
int findl(int x)
{
	int a, b, mid;
	int m;
	a = 1;
	b = n;
	while (a <= b)
	{
		if (val[(a + b) / 2] <= x)
		{
			m = (a + b) / 2;
			a = (a + b) / 2 + 1;
		}
		else
		{
			b = (a + b) / 2 - 1;
		}
	}
	return m;
}
int main()
{
	ifstream in("zombie.in");
	ofstream out("zombie.out");
	int i;
	in >> d;
	in >> n;
	in >> k;
	for (i = 1; i <= n; i++)
	{
		in >> val[i];
	}
	dp[1] = 1;
	for (i = 1; i <= n; i++)
	{
		if (dp[i] == 0)
		{
			if (dp[findl(val[i] + d - 1)] == 0)
				dp[findl(val[i] + d - 1)] = dp[i-1] + k;
			else
				dp[findl(val[i] + d - 1)] = min(dp[findl(val[i] + d - 1)], dp[i-1] + k);
			dp[i] = dp[i - 1] + 1;
		}
		else
		{
			if (dp[findl(val[i] + d - 1)] == 0)
				dp[findl(val[i] + d - 1)] = dp[i-1] + k;
			else
				dp[findl(val[i] + d - 1)] = min(dp[findl(val[i] + d - 1)], dp[i-1] + k);
			dp[i] = min(dp[i - 1] + 1, dp[i]);
			dp[findl(val[i] + d - 1)] = min(dp[findl(val[i] + d - 1)], dp[i-1] + k);
		}
	}
	out << dp[n];
}