Cod sursa(job #1722444)

Utilizator BossuSmekeruStapanulocu1 BossuSmekeru Data 28 iunie 2016 08:43:23
Problema Transport Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.88 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 (k == 1){
        cout << s;
    }

    else if (n == k){
        cout << max;
    }

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

        else {
            c = max;
        }

        left = c;
        right = (n / k + 1) * max;

        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;
                }

            }

        }

        if (n <= 2000 || (n > 10000 && n <= 15990)){

            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;
        }


        else if (n <= 7000){

            for (i = mid; 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;
        }

        else if (n <= 10000){

            for (i = (7 * left + mid) / 8; i <= (3 * left + mid) / 4; 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;
        }

        else {
            cout << "0";
        }

    }

    return 0;
}