Cod sursa(job #533856)

Utilizator feelshiftFeelshift feelshift Data 14 februarie 2011 18:33:11
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
// http://infoarena.ro/problema/transport
#include <stdio.h>
#define maxSize 16002

FILE *in = fopen("transport.in","rt");
FILE *out = fopen("transport.out","wt");

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

// cate transporturi se efectueaza daca se incarca maxim "size" decimetrii cubi
int transports(int size);
// cautare binara pentru valoarea minima transports(size)
// care sa corespunda valorii numberOfTransports
int search(int left,int right);

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

    fscanf(in,"%d",&lenght);
    fscanf(in,"%d",&numberOfTransports);

    for(int i=1;i<=lenght;i++) {
        fscanf(in,"%d",&volume[i]);
        sum += volume[i];

        if(maxim < volume[i])
            maxim = volume[i];
    }

    fprintf(out,"%d\n",search(maxim,sum));

    return (0);
}

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

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

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

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

    if(current)
        ++number;

    return number;
}