Resolvendo problemas no HackerRank:Livro de lições especiais
Tags: javascript, beginners, programming
Published: 2023-04-20 13:51:48

Olá, seja bem vindo a mais um Resolvendo problemas no HackerRank: No caso de hoje, iremos ajudar Lisa a contar um número específico de exercícios de um livro de tarefas com base em alguns parâmetros criados por ela. Vejamos mais informações com a explicação e sua resolução.

**Lisa's Workbook -**

Lisa acabou de receber um novo livro de exercícios de matemática. Uma pasta de trabalho contém problemas de exercícios, agrupados em capítulos. Lisa acredita que um problema é especial se seu índice (dentro de um capítulo) for igual ao número da página onde está localizado. O formato do livro de Lisa é o seguinte:

- Existem n capítulos no livro de exercícios de Lisa, numerados de 1 a n.
- O capítulo th tem problemas arr[i], numerados de 1 a arr[i].
- Cada página pode conter até k problemas. Somente a última página de exercícios de um capítulo pode conter menos de k problemas.
- Cada novo capítulo começa em uma nova página, portanto, uma página nunca conterá problemas de mais de um capítulo.
- A indexação do número da página começa em 1.
- Dados os detalhes da apostila de Lisa, você pode contar o número de problemas especiais?

Exemplo:

- arr = [4,2]
- k = 3

A pasta de trabalho de Lisa contém arr[1] = 4 problemas para o capítulo 1 e arr[2] = 2 problemas para o capítulo 2. Cada página pode conter k = 3 problemas.

A primeira página conterá 3 problemas para o capítulo 1. O problema 1 está na página 1, por isso é especial. 

A página 2 contém apenas o Capítulo 1, Problema 4, portanto, nenhum problema especial está na página 2.

Os problemas do Capítulo 2 começam na página 3 e há 2 problemas. Como não há problema 3 na página 3, também não há problema especial nessa página. Há 1 problema especial em sua pasta de trabalho.

Observação: consulte o diagrama na seção Explicação para obter mais detalhes.

Vejamos agora o algoritmo que irá encontrar os números especiais:

```
function workbook(n, k, arr) {
  //int n: the number of chapters
  //int k: the maximum number of questions per page
  //int arr[n]: the number of problems in each chapter
  
  let chapters=0;
  let pages=1;
  
    for(let i=0;i<n;i++){
      let m=k;
        for(let j=1;j<=arr[i];j++){
          if(j>m){
            pages++;
            m=m+k;
          }
          if(j==pages){
            chapters++;
          }
        }
      pages++;
    }
    return chapters;
}
```

O primeiro loop for é usado para percorrer cada capítulo (de 0 a n-1). Dentro desse loop, a variável "maximum" é inicializada com o valor de "k", que representa o número máximo de questões que podem ser colocadas em uma página. Em seguida, um segundo loop for é usado para percorrer cada problema no capítulo (de 1 a arr[i]).

Para cada problema, o código verifica se a página atual já atingiu o número máximo de questões ("maximum"). Se sim, a variável "pages" é incrementada e "maximum" é atualizada para a próxima página. Se a página atual for igual ao número do problema ("j"), significa que este problema está na primeira página do capítulo e a variável "chapters" é incrementada.

Após o segundo loop for, a variável "pages" é incrementada, para que o próximo capítulo comece na página seguinte.

No final do primeiro loop for, a função retorna o valor da variável "chapters", que representa o número de capítulos que têm pelo menos uma questão na primeira página.

O resultado será:

```
5 3
4 2 6 1 10
```

Assim, concluímos mais um _Resolvendo problemas no HackerRank:_ até a próxima.