Cod sursa(job #1721070)

Utilizator BossuSmekeruStapanulocu1 BossuSmekeru Data 24 iunie 2016 12:31:35
Problema Transport Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>

using namespace std;

int main()
{
    int n, k, c, i, j, *stiva, s = 0, max = 0, transporturi, suma, left, right, mid;
    bool ok = 0;
    ifstream cin ("transport.in");
    ofstream cout ("transport.out");
    cin >> n >> k;
    stiva = new int[n + 1];

    for (i = 1; i <= n; i++){
        cin >> stiva[i];
        s = s + stiva[i];

        if (stiva[i] > max){
            max = stiva[i];
        }

    }

    if (s / k > max){
        c = s / k;
    }

    else {
        c = max;
    }

    left = c;
    right = s;

    while (left < right && transporturi != k){
        mid = left + (right - left) / 2;
        transporturi = 0;
        j = 1;

        while (1){
            suma = 0;

            while (j <= n && suma + stiva[j] <= mid){
                suma = suma + stiva[j];
                j++;
            }

            transporturi++;

            if (transporturi == k){
                break;
            }

            if (transporturi > k){
                left = mid;
                break;
            }

            if (j > n){
                right = mid;
                break;
            }

        }

    }

    for (i = left; i <= right; i++){
        transporturi = 0;
        j = 1;

        while (1){
            suma = 0;

            while (j <= n && suma + stiva[j] <= i){
                suma = suma + stiva[j];
                j++;
            }

            transporturi++;

            if (transporturi > k){
                break;
            }

            if (j > n){
                ok = 1;
                break;
            }

        }

        if (ok == 1){
            break;
        }

    }

    cout << i;
    return 0;
}