Cod sursa(job #1235332)

Utilizator borcanirobertBorcani Robert borcanirobert Data 29 septembrie 2014 15:54:58
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
using namespace std;

FILE *f = fopen( "transport.in", "r" );
FILE *g = fopen( "transport.out", "w" );

const int MAX = 16005;
int N, K;
int a[MAX];

int OKNR( int nr );             /// 1 - ok; -1 - nr trebuie mai mare

int main()
{
    int nr, i;
    bool gt = false;
    int OK;

    fscanf( f, "%d%d", &N, &K );
    for ( i = 1; i <= N; i++ )
        fscanf( f, "%d", &a[i] );

    int st = 0, dr = MAX * MAX;
    while ( !gt )
    {
        nr = ( st + dr ) / 2;
        OK = OKNR( nr );

        if ( OK == -1 )
        {
            if ( OKNR( nr + 1 ) == 1 )
            {
                gt = true;
                nr++;
            }
            else
                st = nr + 1;
        }
        else
            dr = nr - 1;
    }

    fprintf( g, "%d\n", nr );

    fclose(f);
    fclose(g);
    return 0;
}

int OKNR( int nr )
{
    int i = 1, j = 0, c = 0;

    while ( j < K )
    {
        j++;            // mai fac un transport
        while ( c + a[i] <= nr && i <= N )
            c += a[i], i++;

        if ( i > N )
            return 1;
        c = 0;
    }

    return -1;
}