Fair Work Load [Top Coder]

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

Problem Link

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;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *