Pagini recente » Cod sursa (job #498229) | Cod sursa (job #3196686) | Cod sursa (job #1971578) | Cod sursa (job #515282) | Cod sursa (job #213389)
Cod sursa(job #213389)
#include <stdio.h>
#define N_MAX 128
long long A[N_MAX];
long long N,C,P,T,S;
long long V[N_MAX];
int verif(long K)
{
long long nr = 0, cnt = 0, x, cst, l;
for (int i = 1 ; cnt < K ; i++, nr++) {
if ( cnt+A[i] > K ) V[i] = K - cnt;
else V[i] = A[i];
cnt += V[i];
}
cst = 0;
for (int i = nr ; i ; i--) {
if (V[i] == 0) continue;
cst += (V[i] / C) * 2 * i;
l = V[i] % C;
V[i]=0;
if (!l) continue;
for (int j=i-1 ; l+V[j] <= C ; j--) {
l += V[j];
V[j] = 0;
}
cst += 2 * i;
}
if (cst <= T) return 1;
return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("379.in", "r", stdin);
freopen("379.out", "w", stdout);
#endif
scanf("%I64d %I64d %I64d %I64d", &N, &C, &P, &T);
T /= P;
for (int i = 1; i <= N; i++) {
scanf("%I64d ", &A[i]);
S+=A[i];
}
long long st,dr,mid;
st=1;dr=S;
while (st<dr-1)
{
mid=(st+dr)/2;
if ( verif(mid) ) st=mid;
else dr=mid;
}
if ( verif(dr) ) printf("%I64d ", dr);
else printf("%I64d ", st);
return 0;
}