﻿// 1000点問題『Transmission』 - "できるだけ、STL" version
// ネタだからね！！！

#include <vector>
#include <set>
#include <limits>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional>
using namespace std;

#define ALLOF(c)    c.begin(), c.end()
#define INSERTER(s) inserter(s,s.begin())
#define DIVBY(d)    bind2nd(divides<double>(), d)

class Transmission
{
public:
	double gears( vector<int> front, int Min, int Max, int cnt )
	{
		set<double> ratios;
		transform( ALLOF(front), INSERTER(ratios), DIVBY(Min) );
		transform( ALLOF(front), INSERTER(ratios), DIVBY(Max) );
		double acc = numeric_limits<double>::max();
		return gears_r( front, Min+1, Max, cnt-2, ratios, &acc );
	}

private:
	double gears_r( const vector<int>& front, int Min, int Max, int cnt,
	                const set<double>& ratios_fixed, double* acc )
	{
		if( cnt )
			while( Min+cnt < Max )
			{
				set<double> ratios = ratios_fixed;
				transform( ALLOF(front), INSERTER(ratios), DIVBY(Min) );
				gears_r( front, ++Min, Max, cnt-1, ratios, acc );
			}
		else
			{
				vector<double> gaps;
				adjacent_difference( ALLOF(ratios_fixed), back_inserter(gaps) );
				*acc = min( *acc, *max_element(ALLOF(gaps)) );
			}
		return *acc;
	}
};





#include <iostream>
int main()
{
	{
		vector<int> front;
		front.push_back( 10 );
		front.push_back( 50 );
		front.push_back( 10 );
		int Min=5, Max=20, cnt=3;
		cout << Transmission().gears( front, Min, Max, cnt ) << endl;
	}
	{
		vector<int> front;
		front.push_back( 10 );
		front.push_back( 80 );
		int Min=10, Max=50, cnt=5;
		cout << Transmission().gears( front, Min, Max, cnt ) << endl;
	}
	{
		vector<int> front;
		front.push_back( 5 );
		front.push_back( 9 );
		front.push_back( 30 );
		front.push_back( 100 );
		int Min=10, Max=100, cnt=5;
		cout << Transmission().gears( front, Min, Max, cnt ) << endl;
	}
}
