Перечислите точки сетки на 2D плоскости в порядке убывания (x * y)
ДаноN > 0
а такжеM > 0
Я хочу перечислить все (x, y) пары, чтобы 1 & lt; = x & lt; = N и 1 & lt; = y & lt; = M в порядке убывания (x * y).
Пример: учитывая N = 3 и M = 2, последовательность перечисления должна быть:
1. (3, 2) -- 3 * 2 = 6
2. (2, 2) -- 2 * 2 = 4
3. (3, 1) -- 3 * 1 = 3
4. (2, 1) -- 2 * 1 = 2
5. (1, 2) -- 1 * 2 = 2
6. (1, 1) -- 1 * 1 = 1
Получатель чего-то(2, 1)
а также(1, 2)
можно поменять местами. Одним из очевидных способов является перечисление их всех, вставка вvector<pair<int, int> >
и позвонитеstd::sort()
с моей собственной функцией сравнения. Однако, поскольку N и M могут быть большими, и в большинстве случаев мне нужны только первые несколько членов последовательности, я надеюсь, что мог бы быть какой-то более умный способ генерирования такой последовательности вместо генерации их всех и сортировки, требует столько, сколькоN*M
элементы массива.
Update: Я забыл упомянуть, что, хотя в большинстве случаев мне нужны только первые несколько терминов, количество требуемых терминов неизвестно до перечисления.