вхождения массива значений в массив вариантов

82
23 мая 2021, 12:30

Допустим имеется два массива

  1. массив это массив искомых возрастов [2,4,7]
  2. массив это массив возможных возрастов [[0,3],[0,6],[0,11]]

Во втором массиве указанны минимальное и максимальное допустимые возраста.

Требуется определить все ли искомые возрасты занимают только 1 допустимый предел.

Конкретизация: Отель размещение 3CH (0-3)(0-6)(0-11) Можем ли мы заселить в него трех детей

  1. пример 2, 4 и 7 лет. - да
  2. пример 4, 6 и 7 лет. - нет
Answer 1

Спасибо @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;
}
Answer 2

Задача решается с помощью идеи олимпиадного программирования - scanline. Идея такая: храним отсорченный массив координат точек 2 типов : начало отрезка и конец отрезка. Наши отрезки будут массивом возможных возрастов. Пускай для начала отрезка point.type = 1, для конца отрезка point.type = -1. Заведем переменную balance, в которую будем записывать, сколько на данный момент есть начал отрезков(не закрытых, то есть мы находимся по середине отрезка), таким образом:

balance += point.type;

Когда наткнулись на точку из массива из искомых возрастов, проверяем

if (balance == 1)

Реализация довольно простая, думаю, сами справитесь(не знаю C#)

READ ALSO
Разница описаний каскадного удаления в EF 6 и Core

Разница описаний каскадного удаления в EF 6 и Core

Каскадное удаление (автоматическое удаление зависимой сущности после удаления главной) описывается по-разному в EF 6 и EF Core

88
Десериализовать ini в класс

Десериализовать ini в класс

Есть проект, который содержит в себе довольно много различных ini файловЯ могу с ними работать либо через доступные в WinAPI методы, либо с помощью...

95
Datatype mismatch sqlite

Datatype mismatch sqlite

http://prntscrcom/oqvhki - Вот типы в БД Как отметить в БД ID чтобы гуид кушал его как верный тип?

180
ASP.NET Core Linux. Публикация

ASP.NET Core Linux. Публикация

Опубликовал приложение на Linux UbuntuПриложение работает нормально

111