Cod sursa(job #2750959)

Utilizator BuzatuCalinBuzatu Calin BuzatuCalin Data 13 mai 2021 18:30:51
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int n,k,salt,sum,gas,p,ant2,k2,max1,min_min;
vector<int> v,suma;
bool inceput=true;
int caut_binara(int st,int dr,int num,int ant)
{
    int mij=(st+dr+1)/2;
    if(ant!=mij)
    {
        if(num==suma[mij]-gas)
        {
            return mij;
        }
        else if(num<suma[mij]-gas)
        {
            caut_binara(st,mij,num,mij);
        }
        else if(suma[mij]-gas<num)
        {
            caut_binara(mij,dr,num,mij);
        }
    }
    else
    {
        return mij;
    }
}
void af(int pos)
{
    int pos2=pos;
    k2=1;
    gas=suma[pos];
    max1=suma[pos];
    while(pos2<n && k2<k)
    {
        pos2=caut_binara(pos2+1,n-1,suma[pos2],-1);
        if(pos2<n)
        {
            int dif1=abs(suma[pos2]-suma[pos]-max1),dif2=abs(suma[pos2+1]-suma[pos]-max1);
            if(dif1<dif2)
            {
                k2++;
                max1=max(max1,suma[pos2]-suma[pos]);
                pos=pos2;
            }
            else
            {
                
                max1=max(max1,suma[pos2+1]-suma[pos]);
                pos2++;
                pos=pos2;
                k2++;

            }
            gas=max1;
        }  
    }
}
int main()
{
    ifstream fin("transport.in");
    ofstream fout("transport.out");
    fin>>n>>k;
    for(int i=0;i<n;i++)
    {
        fin>>salt;
        v.push_back(salt);
        sum+=salt;
        suma.push_back(sum);
    }
    for(int i=0;i<n;i++)
    {
        af(i);
        if(inceput==true)
        {
            min_min=max1;
            inceput=false;
        }
        else
        {
            min_min=min(min_min,max1);
        }
    }
    fout<<min_min;
}