Cod sursa(job #533591)

Utilizator feelshiftFeelshift feelshift Data 14 februarie 2011 11:47:56
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
// http://infoarena.ro/problema/transport
#include <fstream>
using namespace std;

#define maxSize 16002

ifstream in("transport.in");
ofstream out("transport.out");

int lenght;
int numberOfTransports;
int volume[maxSize];

int transports(int size);
int search(int left,int right);

int main() {
    int currentNumber;
    int maxim = 0;
    int sum = 0;

    in >> lenght >> numberOfTransports;

    for(int i=1;i<=lenght;i++) {
        in >> currentNumber;
        sum = sum + currentNumber;

        volume[i] = currentNumber;

        if(maxim < currentNumber)
            maxim = currentNumber;
    }

    out << search(maxim,sum);

    return (0);
}

int search(int left,int right) {
    int middle = (left + right) / 2;
    int answer = transports(middle);

    if(answer == numberOfTransports) {
        if(answer != transports(middle-1))
                return middle;
            else
                return search(left,middle);
    }
    else
        if(answer < numberOfTransports)
            return search(left,middle);
        else
            return search(middle+1,right);
}

int transports(int size) {
    int number = 0;
    int current = 0;

    for(int i=1;i<=lenght;i++)
        if(current + volume[i] <= size)
            current = current + volume[i];
        else {
            current = volume[i];;
            number++;
        }

    if(current)
        number++;

    return number;
}