Показать сообщение отдельно
  #9 (permalink)  
Старый 06.07.2018, 11:04
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,802

Мое решение (можно значительно упростить):
const wave=5;
const relief='1 2 4 2 3 4 5 1 4 6'.split(' ');
const puddles=[];
let puddle=[];

for(let i=0;i<relief.length;i++){
	const prevHeight=!puddle.length?(relief[i-1]||0):puddle[0];
	const height=relief[i];
	
	if(wave<=height)
		break;
	
	if(!puddle && prevHeight<=height)
		continue;
		
	if(prevHeight>height)
		(!puddle.length?(puddle=[prevHeight]):puddle).push(height);
	
	if(puddle[0]<=height){
		puddles.push(puddle);
		puddle=[];
	}
}

const result=puddles.map(puddle=>{
	const max=+puddle.shift();
	
	return puddle.reduce((r,h)=>r+max-h,0);
}).reduce((r,v)=>r+v,0);
alert(result);
Ответить с цитированием