Middle+
Într-un prototip al unei rețele de publicitate, vânzarea spațiilor publicitare funcționează astfel: cumpărătorii indică în avans prețul lor, iar pentru fiecare spațiu publicitar răspund dacă sunt dispuși să îl cumpere sau nu. Este necesar să implementați o funcție care, înainte de a vinde un spațiu publicitar, să aștepte acceptarea sau refuzul cumpărătorilor cu cele mai mari oferte, apoi să vândă spațiul cumpărătorului cu cea mai mare ofertă dintre cei care au acceptat. Răspunsul funcției trebuie să fie returnat cât mai rapid posibil. Trebuie să returnați indexul cumpărătorului. Exemple: Cumpărătorii oferă prețuri 1, 5, 10 Cumpărătorul cu oferta 10 a refuzat Cumpărătorul cu oferta 1 a acceptat // Încă așteptăm, deoarece poate răspunde cumpărătorul cu prețul 5 Cumpărătorul cu oferta 5 a acceptat // Alegem cumpărătorul cu oferta 5 ------------ Cumpărătorii oferă prețuri 1, 5, 10 Cumpărătorul cu oferta 10 a refuzat Cumpărătorul cu oferta 5 a acceptat // Nu mai așteptăm răspunsul de la cumpărătorul cu oferta 1 - acesta sigur nu va fi ales ------------ Cumpărătorii oferă prețuri 1, 2 Cumpărătorul cu oferta 1 a refuzat Cumpărătorul cu oferta 2 a refuzat // Nu alegem niciun cumpărător interface 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
Răspuns de la AI
Ваша задача — как можно быстрее определить покупателя с максимальной ценой, который согласился купить рекламное место. При этом ответы покупателей приходят асинхронно и могут быть в любом порядке.
Основная идея решения:
- Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
- Запустить параллельно все промисы
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;
}
Таким образом, мы не ждём ответы покупателей с меньшей ценой, если уже получили согласие от более дорогого покупателя. Это ускоряет получение результата.