Pagini recente » Cod sursa (job #2150610) | Cod sursa (job #1354323) | Cod sursa (job #1911587) | Cod sursa (job #1629194) | Cod sursa (job #2203981)
#include<fstream>
#include<vector>
using namespace std;
class InParser{
private:
ifstream File;
static const int buffSZ = (1 << 15);
int buffPos;
char buff[buffSZ];
inline void _advance(){
if(++buffPos == buffSZ){
buffPos = 0;
File.read(buff, buffSZ);
}
}
public:
InParser(const char *FileName){
File.open(FileName);
buffPos = buffSZ - 1;
}
inline InParser &operator >>(int &no){
while(!isdigit(buff[buffPos]))
_advance();
no = 0;
while(isdigit(buff[buffPos])){
no = no * 10 + buff[buffPos] - '0';
_advance();
}
return *this;
}
};
InParser fin("transport.in");
ofstream fout("transport.out");
inline bool isEnough(const vector<int> &Arr, const int &k, const long long &cap){
long long currVol = 0;
int travels = 0;
for(unsigned int idx = 0; idx < Arr.size(); ++idx)
if(currVol + Arr[idx] < cap)
currVol += Arr[idx];
else{
if(currVol + Arr[idx] > cap)
--idx;
++travels;
currVol = 0;
}
if(currVol)
++travels;
return (travels <= k);
}
int main(){
int n, k;
fin >> n >> k;
vector<int> Arr;
Arr.reserve(n);
int MaxCapacity = 0, Max = 0;
for(int no; n; --n){
fin >> no;
Arr.emplace_back(no);
MaxCapacity += no;
Max = max(Max, no);
}
long long low = Max, high = MaxCapacity, mid, cap = 0;
while(low <= high){
mid = low + ((high - low) >> 1);
if(isEnough(Arr, k, mid)){
cap = mid;
high = mid - 1;
}
else
low = mid + 1;
}
fout << cap;
}