Cod sursa(job #953776)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 27 mai 2013 12:09:59
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#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;
}