Pagini recente » Cod sursa (job #1040550) | Cod sursa (job #372672) | Cod sursa (job #1435106) | Cod sursa (job #1421187) | Cod sursa (job #1454221)
#include <stdio.h>
#define SUCCES 0
#define ERROR 1
#define FIN "transport.in"
#define FOUT "transport.out"
#define NMAX 16000
/* Numarul de saltele si numarul de transporturi dorite */
int N, K;
/* Vectorul cu rol de stiva care retine informatia despre saltele */
int stiva[NMAX];
FILE *in, *out;
int solution;
int lower, higher;
int no_transp(int capacity){
int res = 0;
for(int i=0, incarc = 0; i < N; i++){
if((stiva[i] + incarc) <= capacity){
incarc += stiva[i];
} else {
incarc = stiva[i];
res++;
}
}
return res + 1;
}
void solve(){
while(lower < higher-1){
int mid = lower + (higher - lower) / 2;
int tran = no_transp(mid);
if(tran <= K){
higher = mid;
} else {
lower = mid;
}
}
if(no_transp(lower) <= K){
solution = lower;
} else {
solution = higher;
}
}
int main(){
in = fopen(FIN, "rt");
out = fopen(FOUT, "wt");
if(!in || !out) return ERROR;
fscanf(in, "%d%d", &N, &K);
for(int i=0; i < N; i++){
fscanf(in, "%d", &stiva[i]);
if(stiva[i] > solution){
lower = stiva[i];
solution = stiva[i];
}
higher += stiva[i];
}
solve();
fprintf(out, "%d", solution);
fclose(in);
fclose(out);
return SUCCES;
}