Cod sursa(job #1721078)

Utilizator BossuSmekeruStapanulocu1 BossuSmekeru Data 24 iunie 2016 13:05:06
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

using namespace std;

int main()
{
    int n, k, c, i, j, *stiva, s = 0, max = 0, transporturi, suma, left, right, mid;
    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 - 1){
        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){
                right = mid;
                break;
            }

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

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

        }

    }

    transporturi = 0;
    j = 1;

    while (transporturi < k && j <= n){
        suma = 0;

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

        transporturi++;
    }

    if (transporturi == k && j > n){
        cout << left;
    }

    else {
        cout << right;
    }

    return 0;
}