Cod sursa(job #2334964)

Utilizator BungerNadejde George Bunger Data 3 februarie 2019 13:39:56
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("transport.in");
ofstream fout ("transport.out");
const int NMAX=1e3*16+5;
int n,m,v[NMAX],k,maxElem,ans,sumMax;
int Max()
{
    int maxim=v[1];
    for(int i=2;i<=n;i++)
        if(maxim<v[i]) v[i]=maxim;
    return maxim;
}
int suma()
{
    int sum=0;
    for(int i=1;i<=n;i++) sum+=v[i];
    return sum;
}
void citire()
{
    fin>>n>>k;
    for(int i=1;i<=n;i++) fin>>v[i];
    maxElem=Max();
    sumMax=suma();
}
int solutie(int x)
{
    int i=1,transp=0;
    //fout<<"** "<<x<<endl;
    while(i<=n)
    {
        int suma=0;
        while(i<=n)
        {
           // fout<<"i= "<<i<<endl;
            if(suma+v[i]>x)
            {
                transp++;
                break;
            }
            else
            {
            //    fout<<v[i]<<" ";
            suma+=v[i];
            i++;
            if(i==n+1) transp++;
            }
        }
       // fout<<endl<<suma<<endl<<endl;
    }
    i--;
    //fout<<"transp= "<<transp<<" i= "<<i<<endl<<endl;
    if(i<n || transp>k) return -1;
    return 1;
}
void cautBin()
{
    int st=maxElem,dr=sumMax,mij;
    while(st<=dr)
    {
        mij=st+(dr-st)/2;
        if(solutie(mij)==1)
        {
         ans=mij;
         dr=mij-1;
        }
        else st=mij+1;
    }
    fout<<ans;
}
int main()
{
    citire();
    cautBin();
    //solutie(9);
    return 0;
}