@4us4e

Проблема при прохождении теста node?

Нужно код ревью, решение не проходит тест
После очередного завершённого проекта программист Пётр решил переехать в деревню и заняться сельским хозяйством. Мелочиться он не стал, поэтому помимо домика в деревне сразу приобрёл несколько идущих подряд параллельных участков поля, расположенных вдоль прямой дороги. Участки были разделены заборами, при этом все заборы начинались от той самой дороги, но заканчивались на разном удалении от неё не доходя до противоположной границы участка.

Петру нужно объединить эти участки. Но так как Пётр перфекционист, он непременно хочет, чтобы получившийся объединённый участок:

1. был прямоугольным;

2. был ограничен дорогой и двумя уже имеющимися заборами (забор необязательно использовать целиком, а вот продлять забор нельзя);

3. имел наибольшую возможную площадь.

Как и положено разработчику Пётр получает 300к/наносек, поэтому его совсем не беспокоит тот факт, что часть территории окажется неиспользованной.

Пётр хочет отдохнуть, поэтому он попросил вас помочь с нахождением площади такого участка.

Помогите Петру и найдите два забора, которые вместе с дорогой образуют максимальный по площади прямоугольный участок, и выведите эту площадь.

Ширина всех участков одинакова и равна 1.

Входные данные (поступают в стандартный поток ввода)
На вход вашей программе подаётся одна строка, содержащая массив целых чисел length, где length[i] - длина i-ого забора. Иными словами i-ый элемент массива задаёт забор в виде отрезка от (i, 0) до (i, length[i]), где 0 - это дорога.

Причём 0≤length[i]≤10 000, а количество заборов n удовлетворяет условию 2≤n≤100 000.

Все входные данные наших тестов всегда соблюдают указанные параметры, дополнительные проверки не требуются.
const readline = require('readline').createInterface(process.stdin, process.stdout);
var arr=[] ;
var numbers=[];
var lengthBetweenNumbers = [];

readline.on('line', (line) => {
  
    arr.push(line.split(' '));
  for(let elem of arr){
    for(let i=0;i<elem.length;i++){
      numbers.push(Number(elem[i]));
    }
  }
 if(numbers.length==2){
   for(let k=0;k<numbers.length;k++){
     lengthBetweenNumbers.push(numbers[k]);
     lengthBetweenNumbers.sort((a, b) => a - b).reverse();
   }
 }
  else if(numbers.length>2){
    
for (let j = 0; j < numbers.length; j++) {
  for (let i = 0; i < numbers.length; i++) {
    if (numbers[j] > numbers[i]) {
      lengthBetweenNumbers.push((Math.abs(i - j)-1) * numbers[j]);
    } else if (numbers[j] < numbers[i]) {
    
        
      lengthBetweenNumbers.push((Math.abs(i - j)-1) * numbers[i]);
      
        
      }
    }
  }
lengthBetweenNumbers.sort((a, b) => a - b);
}
  }

).on('close', () => {

console.log(lengthBetweenNumbers[lengthBetweenNumbers.length - 1])
    process.exit(0)})
  • Вопрос задан
  • 419 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
i, j: max((j - i) * min(length[i], length(j)), 0 <= i < j <= n
Наивное решение - полный перебор всех пар.
Эвристическое решение:
Берём два крайних забора (left = 0 и right = n-1), вычисляем площадь участка (right - left) * min(length[left], length[right]).
Учитывая, что при сдвиге границ к центру расстояние вдоль забора (right - left) уменьшается, для увеличения площади участка необходимо увеличение min(length[left], length[right]). Поэтому берём ту границу left или right, длина забора для которой меньше, и начинаем двигать к центру, пока длина забора не станет больше предыдущей (length[left'] > length[left] или length[right'] > length[right]).
Вычисляем новую площадь. Если она больше предыдущей, запоминаем положения заборов. Повторяем процедуру сдвигания заборов.
Или псевдокодом:
leftMax := left := 0
rightMsx := right := n - 1
sMax := (right - left) * min(length[left], length[right])
while (left < right) {
  if (length[left] < length[right]) {
    left' := left;
    while (length[left] <= length[left'] && left' < right) {
      left' := left' + 1
    }
    left := left'
  } else {
    right' := left;
    while (length[right] <= length[right'] && left < right') {
      right' := right' - 1
    }
    right := right'
  }
  s := (right - left) * min(length[left], length[right])
  if (s > sMax) {
    sMax := s
    leftMax := left
    rightMax := right
  }
}
Ответ написан
@gorbunoff-denis
Для решения этой задачи надо использовать жадный алгоритм с двумя указателями.

https://leetcode.com/problems/container-with-most-...

https://dev.to/ivsivak/kontieinier-s-naibolshim-ko...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы