Cod sursa(job #2203981)

Utilizator DawlauAndrei Blahovici Dawlau Data 13 mai 2018 22:18:55
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<fstream>
#include<vector>
using namespace std;

class InParser{

    private:
        ifstream File;
        static const int buffSZ = (1 << 15);
        int buffPos;
        char buff[buffSZ];

        inline void _advance(){

            if(++buffPos == buffSZ){

                buffPos = 0;
                File.read(buff, buffSZ);
            }
        }
    public:
        InParser(const char *FileName){

            File.open(FileName);
            buffPos = buffSZ - 1;
        }
        inline InParser &operator >>(int &no){

            while(!isdigit(buff[buffPos]))
                _advance();
            no = 0;
            while(isdigit(buff[buffPos])){

                no = no * 10 + buff[buffPos] - '0';
                _advance();
            }
            return *this;
        }
};

InParser fin("transport.in");
ofstream fout("transport.out");

inline bool isEnough(const vector<int> &Arr, const int &k, const long long &cap){

    long long currVol = 0;
    int travels = 0;
    for(unsigned int idx = 0; idx < Arr.size(); ++idx)
        if(currVol + Arr[idx] < cap)
            currVol += Arr[idx];
        else{

            if(currVol + Arr[idx] > cap)
                --idx;

            ++travels;
            currVol = 0;
        }
    if(currVol)
        ++travels;
    return (travels <= k);
}

int main(){

    int n, k;
    fin >> n >> k;

    vector<int> Arr;
    Arr.reserve(n);

    int MaxCapacity = 0, Max = 0;
    for(int no; n; --n){

        fin >> no;
        Arr.emplace_back(no);
        MaxCapacity += no;
        Max = max(Max, no);
    }

    long long low = Max, high = MaxCapacity, mid, cap = 0;

    while(low <= high){

        mid = low + ((high - low) >> 1);

        if(isEnough(Arr, k, mid)){

            cap = mid;
            high = mid - 1;
        }
        else
            low = mid + 1;
    }
    fout << cap;
}