Cod sursa(job #2070710)

Utilizator MaligMamaliga cu smantana Malig Data 19 noiembrie 2017 20:38:56
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
#include <algorithm>

#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif

using namespace std;
ifstream in("transport.in");
ofstream out("transport.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 5e4 + 50;
const int sMax = 25e4 + 5;
typedef pair<int,int> point;

int N,K,mx;
int v[NMax];

bool can(int);

int main() {
    in>>N>>K;

    int sum = 0;
    mx = 0;
    for (int i=1;i <= N;++i) {
        in>>v[i];
        sum += v[i];
        mx = max(mx,v[i]);
    }

    int pw = 1,pos = 0;
    for (;pw <= sum;pw <<= 1) ;
    pw >>= 1;

    while (pw) {
        if (can(pos+pw) == false) {
            pos += pw;
        }

        pw >>= 1;
    }

    out<<pos+1<<'\n';

    return 0;
}

bool can(int cap) {
    if (cap < mx) {
        return false;
    }

    int sum = 0, nr = 0;
    for (int i=1;i <= N;++i) {
        if (sum + v[i] > cap) {
            ++nr;
            sum = v[i];
        }
        else {
            sum += v[i];
        }
    }

    if (sum != 0) {
        ++nr;
    }

    if (nr <= K) {
        return true;
    }
    return false;
}