Pagini recente » Istoria paginii runda/marcel1/clasament | Cod sursa (job #1678731) | Cod sursa (job #2057573) | Cod sursa (job #2136353) | Cod sursa (job #533855)
Cod sursa(job #533855)
// 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;
}