Recherche de priorité de largeur AtCoder ABC 136 D résolue en Ruby, Perl et Java

introduction

Ce thème

AtCoder Beginner Contest 136 D - Gathering Children Difficulty: 792

Ce thème, recherche de priorité de largeur Ruby

ruby.rb


s = gets.chomp
f, c = 0, 0
p = []
0.upto(s.size - 1) do |i|
  if s[i] == 'R' && f == 1
    f = 0
    p.push(c)
    c = 0
  elsif s[i] == 'L' && f == 0
    f = 1
    p.push(c)
    c = 0
  end
  c += 1
  p.push(c) if s.size - 1 == i
end
ans = Array.new(s.size, 0)
pos = 0
while p.size > 0
  r = p.shift
  l = p.shift
  if (r + l).even?
    pos += r
    ans[pos - 1] = (r + l) / 2
    ans[pos] = (r + l) / 2
    pos += l
  elsif (r.even?)
    pos += r
    ans[pos - 1] = (r + l) / 2
    ans[pos] = (r + l) / 2 + 1
    pos += l
  else
    pos += r
    ans[pos - 1] = (r + l) / 2 + 1
    ans[pos] = (r + l) / 2
    pos += l
  end
end
puts ans.join(' ')

Par exemple, envisagez de diviser la chaîne «RRLLLLRLRRLL» en trois parties: «RRLLLL» «RL» RRLL ».

RRLLLL RL RRLL
111111 11 1111
033000 11 0220

Les enfants se rassembleront dans la partie RL, alors comptez-la et incorporez-la dans le tableau.

even.rb


  if (r + l).even?

Pair et impair semblent être * Ruby *. Perl

perl.pl


use v5.18; # strict say state

chomp (my $s = <STDIN>);
my ($f, $c) = (0, 0);
my @p;
for my $i (0..length($s)-1) {
  if (substr($s, $i, 1) eq 'R') {
    if ($f == 1) {
      push @p, $c;
      $f = 0;
      $c = 0;
    }
  } else {
    if ($f == 0) {
      push @p, $c;
      $f = 1;
      $c = 0;
    }
  }
  $c++;
  push @p, $c if $i == length($s) - 1;
}
my @ans;
for my $i (0..length($s)-1) {
  $ans[$i] = 0;
}
my $pos = 0;
while (@p) {
  my $r = shift @p;
  my $l = shift @p;
  if (($r + $l) % 2 == 0) {
    $pos += $r;
    $ans[$pos-1] = ($r + $l) / 2;
    $ans[$pos] = ($r + $l) / 2;
    $pos += $l;
  } elsif ($r % 2 == 0) {
    $pos += $r;
    $ans[$pos-1] = int(($r + $l) / 2);
    $ans[$pos] = int(($r + $l) / 2) + 1;
    $pos += $l;
  } else {
    $pos += $r;
    $ans[$pos-1] = int(($r + $l) / 2) + 1;
    $ans[$pos] = int(($r + $l) / 2);
    $pos += $l;
  }
}
say join(' ', @ans);

array.pl


ans = Array.new(s.size, 0)       # Ruby

my @ans;                         # Perl
for my $i (0..length($s)-1) {
  $ans[$i] = 0;
}

int ans[] = new int[s.length()]; # Java

De plus, * Perl * convertit implicitement un entier en un nombre réel, vous devez donc le tronquer avec la fonction int.

int.pl


    ans[pos] = (r + l) / 2           # Ruby
    $ans[$pos] = int(($r + $l) / 2); # Perl
    ans[pos] = (r + l) / 2;          # Java

Java

java.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        sc.close();
        int f = 0, c = 0;
        Queue<Integer> que = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.substring(i, i + 1).equals("R")) {
                if (f == 1) {
                    f = 0;
                    que.add(c);
                    c = 0;
                }
                c++;
            } else {
                if (f == 0) {
                    f = 1;
                    que.add(c);
                    c = 0;
                }
                c++;
                if (i == s.length() - 1) {
                    que.add(c);
                }
            }
        }
        int ans[] = new int[s.length()];
        int pos = 0;
        while (que.size() > 0) {
            int r = que.poll();
            int l = que.poll();
            if ((r + l) % 2 == 0) {
                pos += r;
                ans[pos - 1] = (r + l) / 2;
                ans[pos] = (r + l) / 2;
                pos += l;
            } else if (r % 2 == 0) {
                pos += r;
                ans[pos - 1] = (r + l) / 2;
                ans[pos] = (r + l) / 2 + 1;
                pos += l;
            } else {
                pos += r;
                ans[pos - 1] = (r + l) / 2 + 1;
                ans[pos] = (r + l) / 2;
                pos += l;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < (s.length() * 2 - 1); i++) {
            if (i % 2 == 0) {
                sb.append(ans[i / 2]);
            } else {
                sb.append(" ");
            }
        }
        System.out.println(sb);
    }
}

En * Java *, il semble difficile de joindre un tableau d'entiers, donc je l'ai mis dans StringBuilder.

Ruby Perl Java
Longueur du code 685 Byte 940 Byte 1841 Byte
Temps d'exécution 103 ms 143 ms 203 ms
Mémoire 5244 KB 16000 KB 32476 KB

Résumé

Site référencé

Recommended Posts

Recherche de priorité de largeur AtCoder ABC 136 D résolue en Ruby, Perl et Java
Tableau 2D AtCoder ABC129 D résolu en Ruby et Java
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, Perl et Java AtCoder ABC 113 C Reference
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
Concours de programmation AtCoder dwango B à résoudre en Ruby, Perl et Java
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
Résoudre la moyenne multiset ARC104 D avec Scala, Java, C ++, Ruby, Perl, Elixir
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
Stocker dans une carte Java 2D et tourner avec pour instruction
ABC177-Résoudre E avec Ruby
Résolution avec Ruby AtCoder ACL Débutant Contest C Union Find (DSU)
Note n ° 2 "Création d'un historique de recherche avec ArrayList et HashSet" [Java]
Résolution avec Ruby AtCoder 1er test pratique de l'algorithme Une gestion des exceptions
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Installez Java et Tomcat avec Ansible
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Utilisez JDBC avec Java et Scala.
Sortie PDF et TIFF avec Java 8
Crypter avec Java et décrypter avec C #