Middle+
Reklama tarmogʻi prototipida, reklama joylarini sotish quyidagicha tashkil etilgan: xaridorlar oldindan o'z narxlarini aytadilar, va har bir reklama joyiga ular uni sotib olishga tayyormisiz yoki yo'qmi, javob beradilar. Reklama joyini sotishdan oldin, yuqori taklif qilgan xaridorlarning roziligi yoki rad etishini kutish va keyin rozilik berganlar orasidan eng yuqori taklif qilgan xaridorga sotish kerak. Funktsiyaning javobi imkon qadar tezroq bo'lishi kerak. Xaridorning indeksini qaytarish kerak. Misollar: Xaridorlar 1, 5, 10 narxlarni taklif qiladilar 10 narxdagi xaridor rad javobini berdi 1 narxdagi xaridor rozilik bildirdi // Hali kutmoqdamiz, chunki 5 narxdagi xaridor javob berishi mumkin 5 narxdagi xaridor rozilik berdi // 5 narxdagi xaridorni tanlaymiz ------------ Xaridorlar 1, 5, 10 narxlarni taklif qiladilar 10 narxdagi xaridor rad javobini berdi 5 narxdagi xaridor rozilik berdi // 1 narxdagi xaridor javobini kutmaymiz - uni tanlamaymiz ------------ Xaridorlar 1, 2 narxlarni taklif qiladilar 1 narxdagi xaridor rad javobini berdi 2 narxdagi xaridor rad javobini berdi // Hech qanday xaridorni tanlamaymiz type Buyer = { price: number, accepts: () => Promise<boolean>, } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})) .sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }
sobes.tech AI
AIdan javob
Ваша задача — как можно быстрее определить покупателя с максимальной ценой, который согласился купить рекламное место. При этом ответы покупателей приходят асинхронно и могут быть в любом порядке.
Основная идея решения:
- Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
- Запустить параллельно все промисы
accepts(). - Обрабатывать ответы в порядке убывания цены, чтобы как только самый дорогой покупатель согласится, сразу вернуть его индекс.
- Если самый дорогой отказался, ждать ответа следующего по цене и так далее.
Это позволит не ждать всех ответов, а вернуть результат как можно раньше.
Пример реализации:
async function bestBuyer(buyers) {
// Сортируем по убыванию цены
const sorted = buyers
.map((buyer, index) => ({ buyer, index }))
.sort((a, b) => b.buyer.price - a.buyer.price);
// Запускаем все промисы параллельно
const acceptPromises = sorted.map(({ buyer }) => buyer.accepts());
for (let i = 0; i < sorted.length; i++) {
const accepted = await acceptPromises[i];
if (accepted) {
// Возвращаем индекс покупателя с самой высокой ценой, который согласился
return sorted[i].index;
}
}
// Если никто не согласился
return -1;
}
Таким образом, мы не ждём ответы покупателей с меньшей ценой, если уже получили согласие от более дорогого покупателя. Это ускоряет получение результата.