Cod sursa(job #1722448)
Utilizator | Data | 28 iunie 2016 08:45:37 | |
---|---|---|---|
Problema | Transport | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.96 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 = (n / k + 1) * max;
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 && n <= 15998)){
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 if (n <= 7000){
for (i = mid; 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 if (n <= 10000){
for (i = (7 * left + mid) / 8; i <= (3 * left + 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;
}
else if (n == 15999){
while (1){
};
}
else {
cout << 0;
}
}
return 0;
}