Tableau 2D AtCoder ABC129 D résolu en Ruby et Java

introduction

Ce thème

AtCoder Beginner Contest D - Lamp Difficulty: 1080

Ce thème, tableau 2D

Ce que vous faites est simple.

...#..#. Tableau original
12301201 Scannez la matrice d'origine de gauche à droite
33302201 Scannez la matrice numérisée de droite à gauche

Scannez un total de 2 fois pour trouver la plage de lumière dans les directions gauche et droite. Ensuite, scannez deux fois de haut en bas pour trouver la plage de lumière dans le sens haut et bas.

Additionnez les valeurs des tableaux gauche et droit et des tableaux supérieur et inférieur pour trouver la valeur maximale. Java

lamp.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        final Scanner sc = new Scanner(System.in);
        final int H = Integer.parseInt(sc.next());
        final int W = Integer.parseInt(sc.next());
        final char S[][] = new char[H+2][W+2];
        for (int i=1; i<H+1; i++) {
            S[i] =  ("#" + sc.next() + "#").toCharArray();
        }
        sc.close();
        for (int i=0; i<W+2; i++) {
            S[0][i] = '#';
            S[H+1][i] = '#';
        }
        int lr[][] = new int[H+2][W+2];
        int ud[][] = new int[H+2][W+2];

        for (int i=1; i<H+1; i++) {
            int cnt = 0;
            for (int j=0; j<W+1; j++) {
                if (S[i][j]=='.') {
                    cnt++;
                } else {
                    cnt = 0;
                }
                lr[i][j] = cnt;
            }
            for (int j=W; j>0; j--) {
                if (lr[i][j]==0) {
                    cnt = 0;
                } else if (cnt==0) {
                    cnt = lr[i][j];
                } else {
                    lr[i][j] = cnt;
                }
            }
        }
        for (int j=1; j<W+1; j++) {
            int cnt = 0;
            for (int i=0; i<H+1; i++) {
                if (S[i][j]=='.') {
                    cnt++;
                } else {
                    cnt = 0;
                }
                ud[i][j] = cnt;
            }
            for (int i=H; i>0; i--) {
                if (ud[i][j]==0) {
                    cnt = 0;
                } else if (cnt==0) {
                    cnt = ud[i][j];
                } else {
                    ud[i][j] = cnt;
                }
            }
        }

        int ans = 0;
        for (int i=1; i<H+1; i++) {
            for (int j=1; j<W+1; j++) {
                int cnt = lr[i][j] + ud[i][j];
                if (ans<cnt) ans = cnt;
            }
        }
        ans -= 1;
        System.out.println(ans);
    }
}

C'est un cordon sans aucune torsion.

À propos de la compétition en langage de script, etc.

Un blog sur la vitesse des langages de script. Parmi eux, celui qui est pris comme exemple strict dans le langage de script est celui-ci * D --Lamp *.

Ruby

ruby.rb


h, w = gets.split.map(&:to_i)
s = Array.new(h + 1).map{Array.new(w + 1, 0)}
1.upto(h) do |i|
  c = 0
  l = 1
  b = gets
  1.upto(w) do |j|
    if b[j - 1] == '.'
      l = j if c == 0
      c += 1
    elsif c > 0
      l.upto(j - 1) do |k|
        s[i][k] = c
      end
      c = 0
    end
    if j == w && c > 0
      l.upto(j) do |k|
        s[i][k] = c
      end
    end
  end
end
ans = 0
1.upto(w) do |j|
  c = 0
  l = 1
  1.upto(h) do |i|
    if (s[i][j] > 0)
      l = i if c == 0
      c += 1
    elsif c > 0
      l.upto(i - 1) do |k|
        ans = s[k][j] + c if ans < s[k][j] + c
      end
      c = 0
    end
    if i == h && c > 0
      l.upto(i) do |k|
        ans = s[k][j] + c if ans < s[k][j] + c
      end
    end
  end
end
puts ans - 1

Le code avec un nombre de scans légèrement conçu était TLE dans l'ancien environnement Ruby (2.3.3), mais il semble passer en quelque sorte dans le nouvel environnementRuby (2.7.1).

C++14 Java Ruby 2.3.1 Ruby 2.7.1
Ancien environnement Ancien environnement Ancien environnement Nouvel environnement
Longueur du code(Byte) 1420 2044 797 797
Temps d'exécution(ms) 94 465 TLE 1567
Mémoire(KB) 35328 108364 36988 47324

À quelle vitesse

Nom du cas Temps d'exécution (ancien) Temps d'exécution (nouveau) Vieux et nouveau
01.txt 7 59
02.txt 7 63
12.txt 1460 1089 1.34
13.txt 1844 1250 1.48
18.txt 1983 1289 1.54
19.txt 1949 1360 1.43
20.txt 11 59
21.txt 7 63
22.txt 22 70
23.txt 1449 981 1.48
24.txt 9 62
25.txt 10 63

En gros, il semble être "1,4 fois plus rapide". L'ère du «rubis» est arrivée.

Résumé

Site référencé

Recommended Posts

Tableau 2D AtCoder ABC129 D résolu en Ruby et Java
Recherche de priorité de largeur AtCoder ABC 136 D résolue en Ruby, Perl et Java
Résolution avec Ruby, Perl et Java AtCoder ABC 128 C
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 1)
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 2) Méthode de planification dynamique
Résolution avec Ruby AtCoder ABC177 D Union Find
AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
Essayez d'intégrer Ruby et Java avec Dapr
Problème atcoder ABC70 D
[At Coder] Résolvez le problème ABC183 D avec Ruby
[At Coder] Résolvez le problème ABC182 D avec Ruby
ABC177-Résoudre E avec Ruby
Stocker dans une carte Java 2D et tourner avec pour instruction
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Concours de programmation AtCoder dwango B à résoudre en Ruby, Perl et Java
Convertir un tableau bidimensionnel au format csv avec l'API Java 8 Stream
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Installez Java et Tomcat avec Ansible
Résolution avec Ruby AtCoder ACL Débutant Contest C Union Find (DSU)
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Utilisez JDBC avec Java et Scala.
[Java] Déclarer et initialiser un tableau
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
Sortie PDF et TIFF avec Java 8
[Java] Différence entre array et ArrayList
Résolution avec Ruby AtCoder 1er test pratique de l'algorithme Une gestion des exceptions
Qu'est-ce qu'un tableau bidimensionnel Ruby?
Crypter avec Java et décrypter avec C #
Résoudre la moyenne multiset ARC104 D avec Scala, Java, C ++, Ruby, Perl, Elixir
[Introduction à Java] À propos des opérations de tableau (tableau 1D, déclaration de tableau 2D, instanciation, initialisation et utilisation)
Avec ruby ● × Game et Othello (examen de base)
Surveillez les applications Java avec jolokia et hawtio
Premiers pas avec Ruby pour les ingénieurs Java
Lier le code Java et C ++ avec SWIG
Apprendre Ruby avec AtCoder 7 [Contest 168 Triple Dots]
Essayons WebSocket avec Java et javascript!
[Java] Lecture et écriture de fichiers avec OpenCSV
Conversion de JSON en TSV et TSV en JSON avec Ruby
[Java] tableau
[Ruby] Tableau
Tableau Java
Tableau Java
java (tableau)
Tableau Java
[Java] Array
Initialiser le tableau Ruby avec 0 comme Java, c'est-à-dire définir la valeur par défaut sur 0
Tableau Java
tableau java
[Java] Array
Apprendre Ruby avec AtCoder 9 [1er test pratique d'algorithme 3ème] Tri des éléments du tableau
[Ruby] Mots clés avec mots clés et valeurs par défaut des arguments
J'ai essayé d'implémenter Ruby avec Ruby (et C) (j'ai joué avec intégré)
AtCoder ABC 169 C virgule flottante qui tient dans Ruby
Créez et testez des applications Java + Gradle avec Wercker
JSON avec Java et Jackson Part 2 XSS mesures
Créez un notebook Jupyter avec Docker et exécutez ruby
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Préparer un environnement de scraping avec Docker et Java