Cod sursa(job #636509)

Utilizator veleanduAlex Velea veleandu Data 19 noiembrie 2011 20:56:56
Problema Zombie Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.31 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#define maxn 1000010
using namespace std;
long long T[maxn],Best[maxn];
long long i,s,n,d,k,dr;
#define T (T + 100)
#define Best (Best + 100)



const int maxb = 8192;
char buf[maxb];
int ptr = maxb;


int getNumber()
{
    while (buf[ptr] < '0' || '9' < buf[ptr]) {
        if (++ptr >= maxb) {
            fread(buf, 1, maxb,stdin);
            ptr = 0;
        }
    }
    int nr = 0;
    while ('0' <= buf[ptr] && buf[ptr] <= '9') {
        nr = nr * 10 + buf[ptr] - '0';
        if (++ptr >= maxb) {
            fread(buf, 1, maxb,stdin);
            ptr = 0;
        }
    }
return nr;
}

int main()
{
    freopen("zombie.in", "r", stdin);
    freopen("zombie.out", "w", stdout);

    d=getNumber();
    n=getNumber();
    k=getNumber();
    //cout<<d<<" "<<n<<" "<<k<<"\n";
    for ( i=1; i<=n; ++i)
        T[i]=getNumber();
    n++;
    T[n]=1000000002;
    for ( s=1; s<=n; ++s)
    {

        while ( T[s]+d-1>=T[dr] && dr<=n+1)
        {
            dr++;
           // cout<<T[s]+d-1<<" "<<T[dr]<<" "<<dr<<"\n";
        }
        dr--;
        //out<<dr<<"@\n";

        if ( Best[dr+1]>Best[s]+k || Best[d+1]==0)
            Best[dr+1]=Best[s]+k;
        if ( Best[s+1]>Best[s]+1 || Best[s+1]==0)
            Best[s+1]=Best[s]+1;
    }
    cout<<Best[n]<<"\n";
    return 0;
}