Pagini recente »
speshul
|
Istoria paginii runda/rv_1
|
Monitorul de evaluare
|
Test 2012-12-14 Juniori
|
Cod sursă (job #156070)
Cod sursă (job
#156070)
#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;
}