Cod sursă (job #156070)

Utilizator avatar Andreiii500 Puiu Andrei Andreiii500 IP ascuns
Problemă SCV (clasele 9-10) Compilator cpp | 1.59 kb
Rundă Arhiva de probleme Status evaluat
Dată 24 sept. 2015 20:56:08 Scor 30
#include<iostream>
#include<fstream>
#include<iomanip>
#include<math.h>
using namespace std;

#define DIM 5000000/2

ifstream in("scv.in");
ofstream out("scv.out");

int v[DIM]; // Coada pentru constructia SCV-urilor

int C,T,M,X;
int add,day,cnt; // cnt = minerale
int st,dr;

int done(int nr_min) // nr_minerale
{
    int i,k,s,left;

    s=nr_min;

    k=0;
    for(i=st; i<=dr; ++i)
    {
        s += (v[i] - v[i-1]) * (add+k);
        ++k;
    }

    left = ceil((X - s * 1.0) / (add+k));

    return v[dr] + left;
}

int main()
{
    int i,a,b,d_min;

    in>>C>>T>>M>>X;

    d_min = ceil(X*1.0 / M);

    st=1;

    v[0] = 0;
    add=M;

    while(cnt < X)
    {
        //cout<<done(cnt)<<"\n";

        ++day;
        cnt += add;

        //out<<"day = "<<day<<"\n";

        if(st <= dr  &&  v[st] == day)
        {
            //out<<"~~~~~~~~~~~~~~~~~~~~~~~~ SCV ready\n";
            add += M;
            ++st;
        }

        b=0;
        while(b < d_min && cnt >= C)
        {
            //out<<"\ncnt = "<<cnt<<"\n";
            //out<<"Distanta actuala = "<<d_min<<"\n";

            v[st-1] = day;
            v[++dr] = day + T;
            b = done(cnt-C);
            //out<<"Distanta posibila = "<<b<<"\n";
            --dr;

            if(b < d_min)
            {
                //out<<"~~~~~~Construiesc un SCV nou!\n";
                d_min = b;
                cnt -= C;
                v[++dr] = day + T;
            }
            //out<<"\n";
        }
    }

    out<<day<<"\n";

    return 0;
}