Programação Competitiva

Algoritmo resolvidos e explicados da OBI e Maratona de Programação

  • Clipping de notícias
  • Dicas
    • Atribuição para várias variáveis com o mesmo valor
    • Entrada de vários conjuntos de teste até zeros [linguagem C]
    • Muitas saídas para serem mostradas
    • Saída com testes sequenciais [linguagem C]
    • Otimizações para o código
      • Melhorando o desempenho da entrada e saída [C++]
      • Utilize operadores bitwise
      • Shortcodes
  • Solução Computacional x Matemática
    • Importância de pensar os elementos de uma estrutura for
  • Sobre competições de programação
    • Sobre a maratona de programação
    • Sobre a OBI
    • Links para materiais da maratona
    • Links para materiais da OBI
      • Material introdutório para crianças
        • 1. Bem vindo ao maravilhoso mundo da programação
        • Aprendendo lógica com o Angry Birds
        • Blockly

Utilize operadores bitwise

Conhecer os operadores bitwise, além de ajudar a resolver alguns problemas, também podem ser utilizados para melhorar o desempenho da execução do código. Para rever/aprender sobre esses operadores, consulte www.galirows.com.br/meublog/programacao/operadores-bitwise-cpp/

Por exemplo, a multiplicação por valores que são fatores de 2 apresenta melhor desempenho se for feita por deslocamento de bits do que pelo uso do operador de multiplicação. Vale lembrar que cada left shift (<<) em um valor é o mesmo do que multiplicar ele por dois.

Considerando o código abaixo e sua execução utilizando a linha 6 que utiliza o operador de multiplicação, o tempo de execução do algoritmo é entorno de 2,01 segundos. Ao invés disso, utilizando a operação left shift da linha 7, o tempo de execução é entorno de 1,99 segundos. A diferença foi mínima, mas foi suficiente para o algoritmo executar em menos de 2 segundos, o que pode ser a diferença entre ter um timeout no tempo de execução da solução.

#include <stdio.h>

int main(void) {
    int t=1;
    for (int i=0; i<999999999; i++) {
        t*=2;
        //t = t>>1;
    }
    return 0;
}

A diferença no tempo de execução aumenta conforme se aumenta o valor pelo qual é feita a multiplicação. Por exemplo, para multiplicar o valor por 6 (t*=6 e t>>3), os tempos são 2,25 segundos e 1,99 segundos, para o operador de multiplicação e left shift, respectivamente.

  • Sobre o blog

    Nesse blog estão reunidas explicações preparatórias para a Olimpíada Brasileira de Informática (OBI) e a Maratona de Programação.

    São trazidos problemas e resoluções comentadas.
  • Categorias

    • Competição (34)
      • Maratona de Programação (13)
      • OBI (21)
    • Linguagem (33)
      • C/C++ (32)
      • Python (8)
Proudly powered by WordPress Theme: Parament by Automattic.