Допустим имеется два массива
Во втором массиве указанны минимальное и максимальное допустимые возраста.
Требуется определить все ли искомые возрасты занимают только 1 допустимый предел.
Конкретизация: Отель размещение 3CH (0-3)(0-6)(0-11) Можем ли мы заселить в него трех детей
Спасибо @PetSerAl получилось как то так, вариантов при которых данное является не рабочем найти не удалось, но на больших массивах это начинает тормозить и есть память, ищу оптимизацию решения описанного ниже
/// <summary>
/// Описание доступных размещений для детей
/// </summary>
public class SearchIn {
/// <summary>
/// Минимальное значение возраста
/// </summary>
public short AgeFrom { get; set; }
/// <summary>
/// Максимальное значение возраста
/// </summary>
public short AgeTo { get; set; }
/// <summary>
/// Проверка на возможность проживания
/// </summary>
/// <param name="age">Проверяемый возраст</param>
/// <returns>Может проживать</returns>
public bool CanLive(int age) {
return AgeFrom <= age && AgeTo >= age;
}
}
/// <summary>
/// Проверка на возможность проживания в данном номере
/// </summary>
/// <param name="askAges">Запрашиваемые возраста для проживания</param>
/// <returns>Возможность проживания</returns>
public bool AccommodationCheck(int[] askAges) {
// проверка на достаточную возможность размещения детей в номере.
if (askAges.Length > search_in.Length)
return false;
// Перебор с наименьшего запрашиваемого возраста
foreach (var askAge in askAges.OrderBy(x=>x)) {
// Поиск возможного размещения с наименьшим максимальным значением возраста.
var element = search_in.Where(x => x.CanLive(askAge)).OrderBy(x => x.AgeTo).FirstOrDefault();
// В случае отсутствия возможного размещения
if (element == null)
return false;
// Удаляем из массива вариант использованного размещения
search_in = search_in.Where(x => x != element).ToArray();
}
return true;
}
Задача решается с помощью идеи олимпиадного программирования - scanline. Идея такая: храним отсорченный массив координат точек 2 типов : начало отрезка и конец отрезка. Наши отрезки будут массивом возможных возрастов. Пускай для начала отрезка point.type = 1, для конца отрезка point.type = -1. Заведем переменную balance, в которую будем записывать, сколько на данный момент есть начал отрезков(не закрытых, то есть мы находимся по середине отрезка), таким образом:
balance += point.type;
Когда наткнулись на точку из массива из искомых возрастов, проверяем
if (balance == 1)
Реализация довольно простая, думаю, сами справитесь(не знаю C#)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Каскадное удаление (автоматическое удаление зависимой сущности после удаления главной) описывается по-разному в EF 6 и EF Core
Есть проект, который содержит в себе довольно много различных ini файловЯ могу с ними работать либо через доступные в WinAPI методы, либо с помощью...
http://prntscrcom/oqvhki - Вот типы в БД Как отметить в БД ID чтобы гуид кушал его как верный тип?
Опубликовал приложение на Linux UbuntuПриложение работает нормально