Cod sursa(job #1408305)

Utilizator VAIonescuIonescu Vlad-Andrei VAIonescu Data 29 martie 2015 23:06:18
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
using namespace std;

const int nmax=16000;
int saltele[nmax+1];
int n,k;

bool ok(int smax){
    int i;
    int s=0;
    int transporturi=0;
    for (i=1;i<=n;++i){
        if (s+saltele[i]>smax){
            s=0;
            ++transporturi;
        }
        s+=saltele[i];
    }
    if (s>0){
        ++transporturi;
    }
    return transporturi<=k;
}

int main()
{
    /*Deschid fisierele*/
    freopen("transport.in","r",stdin);
    freopen("transport.out","w",stdout);
    /* Variabile */
    int i;
    int s=0;
    /*Input*/
    scanf("%d%d",&n,&k);
    if (n==k){
        int maxim=-1;
        for (i=1;i<=n;++i){
            scanf("%d",&saltele[i]);
            if (saltele[i]>maxim){
                maxim=saltele[i];
            }
        }
        printf("%d",maxim);
        return 0;
    }
    for (i=1;i<=n;++i){
        scanf("%d",&saltele[i]);
        s+=saltele[i];
    }
    /*Binary Search prin toate sumele maxime*/
    int st=1;
    int dr=s;
    int med,last=-1;
    while (st<=dr){
        med=(st+dr)>>1;
        //Daca suma este buna sau prea mare, incerc una mai mica. Daca nu, incerc una mai mare
        if (ok(med)){
            last=med;
            dr=med-1;
        }
        else{
            st=med+1;
        }
    }
    printf("%d",last);
    return 0;
}