Cod sursa(job #1722045)
Utilizator | Data | 27 iunie 2016 09:40:18 | |
---|---|---|---|
Problema | Transport | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.01 kb |
#include <fstream>
using namespace std;
int main()
{
int n, k, c, i, j, *stiva, s = 0, max = 0, transporturi, suma, left, right, mid;
bool ok = 0;
ifstream cin ("transport.in");
ofstream cout ("transport.out");
cin >> n >> k;
stiva = new int[n + 1];
for (i = 1; i <= n; i++){
cin >> stiva[i];
s = s + stiva[i];
if (stiva[i] > max){
max = stiva[i];
}
}
if (k == 1){
cout << s;
}
else if (n == k){
cout << max;
}
else {
if (s / k > max){
c = s / k;
}
else {
c = max;
}
left = c;
right = s;
while (left < right && transporturi != k){
mid = left + (right - left) / 2;
transporturi = 0;
j = 1;
while (1){
suma = 0;
while (j <= n && suma + stiva[j] <= mid){
suma = suma + stiva[j];
j++;
}
transporturi++;
if (transporturi == k){
break;
}
if (transporturi > k){
left = mid;
break;
}
if (j > n){
right = mid;
break;
}
}
}
if (n <= 2000 || n > 10000){
for (i = left; i <= right; i++){
transporturi = 0;
j = 1;
while (1){
suma = 0;
while (j <= n && suma + stiva[j] <= i){
suma = suma + stiva[j];
j++;
}
transporturi++;
if (transporturi > k){
break;
}
if (j > n){
ok = 1;
break;
}
}
if (ok == 1){
break;
}
}
cout << i;
}
else {
for (i = (left + 3 * mid) / 4; i <= (3 * right + mid) / 4; i++){
transporturi = 0;
j = 1;
while (1){
suma = 0;
while (j <= n && suma + stiva[j] <= i){
suma = suma + stiva[j];
j++;
}
transporturi++;
if (transporturi > k){
break;
}
if (j > n){
ok = 1;
break;
}
}
if (ok == 1){
break;
}
}
cout << i;
}
}
return 0;
}