Cod sursa(job #3236707)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 30 iunie 2024 16:20:35
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MAX_N = 16005;
int n, k;
int v[MAX_N];

bool Check(int q) {
    int checks = 0;
    int currSum = 0;
    for (int i = 0; i < n - 1; i++) {
        currSum += v[i];
        if (currSum > q) {
            checks++;
            currSum = v[i];
        }
        else if (currSum == q) {
            checks++;
            currSum = 0;
        }
    }

    currSum += v[n - 1];
    if (currSum > q) {
        checks += 2;
    }
    else {
        checks++;
    }

    if (checks <= k) {
        return true;
    }
     return false;
}

int BinSearch(int lf, int rg) {
    int bestAns = MAX_N;

    while (lf <= rg) {
        int mid = lf + (rg - lf) / 2;

        if (Check(mid)) {
            rg = mid - 1;
            bestAns = mid;
        }
        else {
            lf = mid + 1;
        }
    }

    return bestAns;
}

int main() {
    fin >> n >> k;
    
    int minVal = 0;
    int maxVal = 0;
    for (int i = 0; i < n; i++) {
        fin >> v[i];
        if (v[i] > minVal) {
            minVal = v[i];
        }
        maxVal += v[i];
    }

    fout << BinSearch(minVal, maxVal);

    return 0;
}