This problem was used for: (@ Top coder)
Single Round Match 169 Round 1 – Division I, Level Two
Single Round Match 169 Round 1 – Division II, Level Three
class FairWorkload{
public:
int getMostWork(vector<int> folder,int worker)
{
int n = folder.size();
int lw = *max_element(folder.begin(),folder.end());
int hi = accumulate(folder.begin(),folder.end(),0);
int mid_load;
int req_workers=1;
int cur_load;
if(worker==1)
return hi;
while(lw<hi)
{
mid_load = (lw+hi)/2;
cur_load=0;
req_workers=1;
for(int i=0;i<n;i++)
{
if(cur_load+folder[i]<=mid_load)
{
cur_load += folder[i];
}
else
{
cur_load=folder[i];
req_workers += 1;
}
}
if(req_workers<=worker)
hi = mid_load;
else if(req_workers>worker)
lw=mid_load+1;
}
return hi;
}
};
Total solution to run and test as a single program.
#include <iostream>
#include <cstdio>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
vector<int> folder;
class FairWorkload{
public:
int getMostWork(vector<int> folder,int worker)
{
int n = folder.size();
int lw = *max_element(folder.begin(),folder.end());
int hi = accumulate(folder.begin(),folder.end(),0);
int mid_load;
int req_workers=1;
int cur_load;
if(worker==1)
return hi;
while(lw<hi)
{
mid_load = (lw+hi)/2;
cur_load=0;
req_workers=1;
for(int i=0;i<n;i++)
{
if(cur_load+folder[i]<=mid_load)
{
cur_load += folder[i];
}
else
{
cur_load=folder[i];
req_workers += 1;
}
}
if(req_workers<=worker)
hi = mid_load;
else if(req_workers>worker)
lw=mid_load+1;
}
return hi;
}
};
int main()
{
int a,workers,n;
while(1)
{
cout<<"enter no of file cabinets: ";
cin>>n;
folder.clear();
for(int i=0;i<n;i++)
{
cin>>a;
folder.push_back(a);
}
cin>>workers;
FairWorkload fair;
cout<<fair.getMostWork(folder,workers)<<"\n";
}
return 0;
}