#include <iostream>

class District
{
	std::string name;
	size_t area;
	size_t population;
public:
	District() : District("None", 0, 0) {}
	District(const std::string _name, const size_t _area, const size_t _population) : name(_name), area(_area), population(_population) {}
	void changeName(std::string name)
	{
		this->name = name;
	}
	void changePopulation(unsigned int population)
	{
		this->population = population;
	}
	float getDensity() const
	{
		return static_cast<float>(population) / area;
	}
	std::string getName() const
	{
		return name;
	}
	size_t getArea() const
	{
		return area;
	}
	size_t getPopulation() const
	{
		return population;
	}
	void init(const std::string name, const size_t area, const size_t population) 
	{
		this->name = name;
		this->area = area;
		this->population = population;
	}
	bool operator >(const District& obj) const
	{
		return getDensity() > obj.getDensity();
	}
};

class City
{
	District* district;
	size_t number_of_district;
public:
	City() = delete;
	City(size_t number_of_district)
	{
		this->number_of_district = number_of_district;
		district = new District[number_of_district];
	}
	~City()
	{
		delete[] district;
	}
	
	void init()
	{
		std::string name;
		size_t 
			area,
			population;
		for(size_t i = 0; i < number_of_district; i++)
		{
			std::cout << "Введите имя района: ";
			std::cin >> name;
			
			std::cout << "Введите площадь(в кв. км): ";
			std::cin >> area;
			
			std::cout << "Введите численность населения: ";
			std::cin >> population;	
			
			district[i].init(name, area, population);	
		}
	}
	float getAvgArea() const
	{
		float tmp(0.0f);
		for(size_t i = 0; i < number_of_district; i++)
			tmp += district[i].getArea();
		return tmp / number_of_district;
	}
	void getMaxDensity()
	{
		size_t 
			index;
		for(size_t i = 0; i < number_of_district-1; i++)
			if(district[i] > district[i+1])
				index = i;
		std::cout << "Самый плотнонаселенный район: " << district[index].getName() << std::endl;
	}
	float getDensity(size_t number_of_district) const
	{
		return static_cast<float>(district[number_of_district].getPopulation()) / district[number_of_district].getArea();
	}
	std::string getName(size_t number_of_district) const
	{
		return district[number_of_district].getName();
	}
	size_t getArea() const
	{
		return district[number_of_district].getArea();
	}
	size_t getPopulation() const
	{
		return district[number_of_district].getPopulation();
	}
};
int main()
{
	City Novokuznetsk(5); // В г. Новокузнецке 5 районов
	
	Novokuznetsk.init();
	
	std::cout << "Средняя площадь районов = " << Novokuznetsk.getAvgArea() << std::endl;
	Novokuznetsk.getMaxDensity();
	
	std::cout << "Название 2-го района = " << Novokuznetsk.getName(2) << std::endl;
	
	return 0;
}
