Pagini recente » Cod sursa (job #2978882) | Cod sursa (job #2093661) | Cod sursa (job #1727187) | Cod sursa (job #2344514) | Cod sursa (job #2622978)
#include <iostream>
using namespace std;
FILE * fin;
int computeTransports( int * v, int N, int C ){
int load = 0;
int transports = 0;
for ( int i = 0; i < N; i++ ){
load+=v[i];
if ( load == C ){
load = 0;
transports++;
} else if ( load > C ){
load = v[i];
transports++;
}
}
if ( load > 0 ){
transports++;
}
return transports;
}
FILE * fout;
int main(){
int N, K;
int v[16002];
fin = fopen("transport.in","r");
fscanf(fin,"%d%d",&N,&K);
int max = 0;
int minC = 0;
for ( int i = 0; i < N; i++ ){
fscanf(fin,"%d",v+i);
max += v[i];
if ( minC < v[i])
minC = v[i];
}
int C = 0;
/*
for ( int i = minC; i <= max; i++ ){
int res = computeTransports(v,N,i);
cout << res << " " << i << endl;
if ( res <= K ){
C = i;
break;
}
}
int target = C;
*/
//cout << endl;
/*
C = max/2;
int min = minC;
int last = -1;
while( true ){
int res = computeTransports(v,N,C);
cout << res << " " << C << endl;
if ( res <= K ){
max = C;
C = (C+min)/2;
last = C;
break;
} else if ( res > K ){
min = C;
C = (C+max)/2+1;
}
if ( last == C ){
break;
}
last = C;
}*/
C = max/2;
int L = minC;
int R = max;
// r <= K, C minimal
while(true){
int r = computeTransports(v,N,C);
//cout << C << " " << r << endl;
if ( r <= K ){
R = C;
C = (C+L)/2-1;
} else if ( r > K ){
L = C;
C = (C+R)/2+1;
}
if ( R-L <= 5 ){
break;
}
}
for ( int i = L; i <= R; i++ ){
int res = computeTransports(v,N,i);
//cout << res << " " << i << endl;
if ( res <= K ){
C = i;
break;
}
}
/*
cout << "res " << C << " " << L << "-" << R << endl;
if ( C == target ){
cout << "WORKS!" << endl;
} else {
cout << "Failed!" << endl;
}
*/
fout = fopen("transport.out","w");
fprintf(fout,"%d",C);
fclose(fout);
fclose(fin);
return 0;
}