Cod sursa(job #2312065)

Utilizator mirceatlxhaha haha mirceatlx Data 4 ianuarie 2019 09:23:52
Problema Transport Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
int n,i,k;
int v[16005];
int s[1000000];
int vmax=0;
int suma=0;
void Citire()
{
    fin>>n>>k;
    for(i=1; i<=n; i++)
    {
        fin>>v[i];
        suma=suma+v[i];
        if(v[i]>vmax)
            vmax=v[i];
    }

}

void Creare(int vmax,int suma)
{
    for(i=vmax;i<=suma;i++)
        s[i]=i;
}


int main()
{
    Citire();
    Creare(vmax,suma);
    int Left=vmax;
    int Right=suma;
    int Mid;
    int ee;
     bool ok=false;
    while(Left<=Right)
    {
        ok=false;
        int nr=0;
        Mid=(Left+Right)/2;
        if(s[Mid])
        {
            int sum=0;
            nr=0;
            for(i=1; i<=n; i++)
            {
                if(sum+v[i]<=s[Mid])
                {
                    sum=sum+v[i];
                    if(sum==s[Mid])
                    {
                        sum=0;
                        nr++;
                    }
                }
                else
                {
                    sum=0;
                    sum=sum+v[i];
                    nr++;
                }
            }
            if(sum<s[Mid])
                nr++;
            if(nr<=k)
            {
                ee=s[Mid];
                ok=true;
            }
        }
        if(ok)
        {
            Right=Mid-1;
        }
        else
        {
            if(nr>v[Mid])
                Left=Mid+1;
            else
                Right=Mid-1;
        }
    }

fout<<ee;

    return 0;
}