Cod sursa(job #213389)

Utilizator devilkindSavin Tiberiu devilkind Data 9 octombrie 2008 17:47:18
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#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;
}