Cod sursa(job #1027166)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 12 noiembrie 2013 15:21:42
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 10000000
using namespace std;

vector<int> st;

class Truck{
public: mutable int capacity, nrT;
    Truck(int c):capacity(c),nrT(-1){}
    Truck(){}
    int getNrT()const{
        if(nrT!=-1) return nrT;
        else {
            nrT = 1;
            int s = 0;
            for(int i=0;i<st.size();i++) {
                if(st[i] > capacity)
                {    nrT = INF;break;}
                else if(s+st[i] > capacity){
                    s=st[i];nrT++;
                }
                else s+=st[i];
            }
            return nrT;
        }
    }
    
    bool operator<(const Truck& other)const{return this->getNrT()>other.getNrT();}
    bool operator>(const Truck& other)const{return this->getNrT()<other.getNrT();}
};

int getTransportCount(int capacity) {
    int nrT = 1;
    int s = 0;
    for(int i=0;i<st.size();i++) {
        if(st[i] > capacity)
        {    nrT = INF;break;}
        else if(s+st[i] > capacity){
            s=st[i];nrT++;
        }
        else s+=st[i];
    }
    return nrT;
}

int getBin(int st,int dr,int k) {
    if(st == dr) return st;
    else {
        int m = (st+dr)/2;
        if(getTransportCount(m) > k){
            return getBin(m+1,dr,k);
        }
        else return getBin(st,m,k);
    }
}


int main(){
    int n,k,x;
    freopen("transport.in","r",stdin);
    freopen("transport.out","w",stdout);
    cin>>n>>k;
    for(int i=0;i<n;i++) {
        cin>>x;
        st.push_back(x);
    }
    
//    vector<Truck> v;
//    for(int i=0;i<257000000;i++) {
//        v.push_back(Truck(i));
//    }
//    
//    Truck mock;
//    mock.nrT = k;
//    vector<Truck>::iterator it= lower_bound(v.begin(), v.end(), mock);
//    cout<<it->capacity;
    cout<<getBin(0,257000000,k);
    return 0;
}