Pagini recente » Cod sursa (job #1715965) | Cod sursa (job #1810712) | Cod sursa (job #2233392) | Cod sursa (job #903743) | Cod sursa (job #953776)
Cod sursa(job #953776)
#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
bool CheckTransportValidity(const vector<short>& vMattresses, int capacity, int k)
{
int transports = 0;
int i=0;
do
{
int sum = 0;
for (; i < vMattresses.size(); ++i)
{
if (capacity < vMattresses[i])
{
return false;
}
if (sum + vMattresses[i] <= capacity)
{
sum += vMattresses[i];
}
else
{
break;
}
}
transports++;
} while(i < vMattresses.size() && transports <= k);
return transports <= k;
}
int main()
{
int n, k;
vector<short> vMattresses;
fstream fin("transport.in", fstream::in);
fstream fout("transport.out", fstream::out);
fin >> n >> k;
//cout << n << " " << k << endl;
istream_iterator<short> itIn(fin);
copy_n(itIn, n, back_inserter(vMattresses));
/*ostream_iterator<short> itOut(cout, " ");
copy_n(vMattresses.begin(), n, itOut);
cout << endl << endl;*/
int sum = 0;
sum = accumulate(vMattresses.begin(), vMattresses.end(), sum);
//cout << sum << endl;
int step = 1;
while (step < sum) step <<= 1;
int capacity = 0;
int lastGood = sum;
for (; step > 0; step >>= 1)
{
if (capacity + step <= sum)
{
if (CheckTransportValidity(vMattresses, capacity + step, k) == false)
{
capacity += step;
}
else
{
lastGood = capacity + step;
}
}
}
fout << lastGood << "\n";
return 0;
}