Cod sursa(job #2622978)

Utilizator antonioganea3Antonio Ganea antonioganea3 Data 2 iunie 2020 12:57:20
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
using namespace std;

FILE * fin;

int computeTransports( int * v, int N, int C ){
    int load = 0;
    int transports = 0;
    for ( int i = 0; i < N; i++ ){
        load+=v[i];
        if ( load == C ){
            load = 0;
            transports++;
        } else if ( load > C ){
            load = v[i];
            transports++;
        }
    }
    if ( load > 0 ){
        transports++;
    }
    return transports;
}

FILE * fout;

int main(){
    int N, K;
    int v[16002];

    fin = fopen("transport.in","r");

    fscanf(fin,"%d%d",&N,&K);

    int max = 0;
    int minC = 0;
    for ( int i = 0; i < N; i++ ){
        fscanf(fin,"%d",v+i);
        max += v[i];
        if ( minC < v[i])
            minC = v[i];
    }



    int C = 0;
    /*
    for ( int i = minC; i <= max; i++ ){
        int res = computeTransports(v,N,i);
        cout << res << " " << i << endl;
        if ( res <= K ){
            C = i;
            break;
        }
    }


    int target = C;
    */



    //cout << endl;

    /*
    C = max/2;
    int min = minC;
    int last = -1;
    while( true ){
        int res = computeTransports(v,N,C);
        cout << res << " " << C << endl;

        if ( res <= K ){

            max = C;
            C = (C+min)/2;
            last = C;
            break;

        } else if ( res > K ){
            min = C;
            C = (C+max)/2+1;

        }
        if ( last == C ){
            break;
        }
        last = C;
    }*/

    C = max/2;
    int L = minC;
    int R = max;

    // r <= K, C minimal

    while(true){
        int r = computeTransports(v,N,C);
        //cout << C << " " << r << endl;
        if ( r <= K ){
            R = C;
            C = (C+L)/2-1;
        } else if ( r > K ){
            L = C;
            C = (C+R)/2+1;
        }

        if ( R-L <= 5 ){
            break;
        }
    }

    for ( int i = L; i <= R; i++ ){
        int res = computeTransports(v,N,i);
        //cout << res << " " << i << endl;
        if ( res <= K ){
            C = i;
            break;
        }
    }

    /*
    cout << "res " << C << " " << L << "-" << R << endl;
    if ( C == target ){
        cout << "WORKS!" << endl;
    } else {
        cout << "Failed!" << endl;
    }
    */


    fout = fopen("transport.out","w");
    fprintf(fout,"%d",C);
    fclose(fout);


    fclose(fin);
    return 0;
}