AtCoder ARC104 B Somme cumulative résolue en Ruby, Python et Java

introduction

Ce thème

AtCoder Regular Contest B - DNA Sequence Difficulty: 410

Ce thème, somme cumulée

C'est un problème de somme cumulative, mais cette fois nous avons besoin de quatre sommes cumulées de ʻA''C''G'T`. Ruby

ruby.rb


n, s = gets.chomp.split
n = n.to_i
a = [0]
c = [0]
g = [0]
t = [0]
n.times do |i|
  a << a[-1]
  c << c[-1]
  g << g[-1]
  t << t[-1]
  if s[i] == 'A'
    a[i + 1] += 1
  elsif s[i] == 'C'
    c[i + 1] += 1
  elsif s[i] == 'G'
    g[i + 1] += 1
  elsif s[i] == 'T'
    t[i + 1] += 1
  end
end
cnt = 0
n.times do |i|
  at = a[i] - t[i]
  cg = c[i] - g[i]
  (i.next).upto(n) do |j|
    cnt += 1 if a[j] - t[j] == at && c[j] - g[j] == cg
  end
end
puts cnt

J'ai reflété l'idée de @scivola dans la section commentaires.

ruiseki.rb


  a << a[-1]
  c << c[-1]
  g << g[-1]
  t << t[-1]

Lors de la création d'un tableau cumulatif, vous pouvez également préparer d'abord le nombre d'éléments requis. Cette fois, j'ai appelé l'élément final avec [-1] et je l'ai ajouté.

hantei.rb


  at = a[i] - t[i]
  cg = c[i] - g[i]
  (i.next).upto(n) do |j|
    cnt += 1 if a[j] - t[j] == at && c[j] - g[j] == cg
  end

Si le nombre d'éléments de "A" C "G" T` dans l'intervalle est le même, il peut être jugé "complémentaire". Python

pypy.py


from sys import stdin

def main():
    input = stdin.readline
    n, s = input().split()
    n = int(n)
    s = 'N' + s + 'N'
    cnt = 0
    for i in range(1, n + 2):
        a = 0
        c = 0
        g = 0
        t = 0
        j = i + 1
        while True:
            if s[i] == 'A':
                a += 1
            elif s[i] == 'C':
                c += 1
            elif s[i] == 'G':
                g += 1
            elif s[i] == 'T':
                t += 1
            else:
                break
            if s[j] == 'A':
                a += 1
            elif s[j] == 'C':
                c += 1
            elif s[j] == 'G':
                g += 1
            elif s[j] == 'T':
                t += 1
            else:
                break
            if a == t and c == g:
                cnt += 1
            i -= 1
            j += 1
    print(cnt)
main()

pypy est une autre solution. Avec cette solution, il devient «TLE» en «Python» et «Ruby».

banpei.py


    s = 'N' + s + 'N'

Il y a des gardes avant et après la corde. Il est utilisé pour la condition de "break" with "while".

hiroge.py


            i -= 1
            j += 1

Nous vérifions le nombre en élargissant la plage à chaque position de caractère Java

java.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        String s = "N" + sc.next() + "N";
        sc.close();

        int cnt = 0;
        for (int k = 1; k < n+2; k++) {
            int i = k;
            int j = k + 1;
            int gn = 0;
            int cn = 0;
            int tn = 0;
            int an = 0;
            while (true) {
                if (s.charAt(i) == 'A') {
                    an++;
                } else if (s.charAt(i) == 'C') {
                    cn++;
                } else if (s.charAt(i) == 'G') {
                    gn++;
                } else if (s.charAt(i) == 'T') {
                    tn++;
                } else {
                    break;
                }
                if (s.charAt(j) == 'A') {
                    an++;
                } else if (s.charAt(j) == 'C') {
                    cn++;
                } else if (s.charAt(j) == 'G') {
                    gn++;
                } else if (s.charAt(j) == 'T') {
                    tn++;
                } else {
                    break;
                }
                if (an == tn && cn == gn) {
                    cnt++;
                }
                i--;
                j++;
            }
        }
        System.out.println(cnt);
    }
}

«Java» est la même solution que «Pypy». J'ai reflété l'idée de @ c-yan dans la section des commentaires.

i.java


        for (int k = 1; k < n+2; k++) {
            int i = k;

Contrairement à Python et Ruby, si vous affectez à une variable de boucle dans un bloc, cela affectera la variable de boucle suivante, vous l'assignez donc à une autre variable.

Ruby Pypy Java
Longueur du code(Byte) 482 920 1436
Temps d'exécution(ms) 1011 336 335
Mémoire(KB) 14676 69312 39456

Résumé

Recommended Posts

AtCoder ARC104 B Somme cumulative résolue en Ruby, Python et Java
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 098 C Somme cumulative
Résoudre avec Ruby et Python AtCoder ABC084 D Somme cumulative des nombres premiers
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 B
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 107 B Manipulation de chaînes
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 047 C Expression régulière
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 086 C Hash Sorting
Résolution avec Ruby et Python AtCoder ARC 059 C Méthode du carré minimum
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
Résolution avec Ruby et Python AtCoder ARC067 C factorisation premier
Résolution avec Ruby, Python et numpy AtCoder ABC054 B Calcul de la matrice
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 065 C-th power
AtCoder JSC2019 Qual B à résoudre par Ruby et Python
Résolvez AtCoder 167 avec python
AtCoder ABC130 D Dichotomie de la somme cumulée résolue par Ruby et Python
Résolution avec Ruby, Perl, Java et Python AtCoder CADDi 2018 C factorisation premier
AtCoder ABC 165 D Floor Function résolue en Ruby, Perl, Java et Python
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 131 D Tri des tableaux
Résolution avec Ruby et Python AtCoder ABC172 C Dichotomie de somme cumulée
Résolvez AtCoder ABC166 avec python
Simulation AtCoder ARC080 D résolue avec Ruby et Python
Résolution avec Ruby et Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 066 C Hash carré itératif
Résolution avec Ruby, Perl, Java et Python AtCoder Diverta 2019 Concours de programmation Manipulation de chaînes C
Résolution avec Ruby et Python AtCoder ABC178 D Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ABC151 D Recherche de priorité de largeur
Résolution avec Ruby et Python AtCoder AISING2020 D Méthode carrée itérative
Résolution avec Ruby et Python AtCoder ABC011 C Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ABC153 E Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ABC138 D Liste adjacente
Scraping avec Node, Ruby et Python
Recommandation de résolution des problèmes d'AtCoder avec python (20200517-0523)
Résolution avec Ruby, Python et networkx AtCoder ABC168 D Liste adjacente
Résoudre AtCoder ABC168 avec python (A ~ D)
Crypter avec Ruby (Rails) et décrypter avec Python
Scraping Web facile avec Python et Ruby
Résolution avec Ruby et Python AtCoder ABC057 C Décomposition du facteur premier Recherche complète de bits
AtCoder Beginner Contest 170 B Problème Explication "Crane and Turtle" (Python3, C ++, Java)
MessagePack-Try pour lier Java et Python avec RPC
Résolvez "AtCoder version! Arimoto (Débutant)" avec Python!
Benchmarks langage C, Java, Python avec factorisation prime
Ruby, Python et carte
Résolvez des équations différentielles normales simultanées avec Python et SymPy.
Python et Ruby se séparent
Étudiez l'échange de données Java et Python avec Apache Arrow
Résoudre Atcoder ABC176 (A, B, C, E) en Python
Résolvez POJ 2386 avec python
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Gestion des versions de Node, Ruby et Python avec anyenv
[Python] Somme cumulée ABC179D
AtCoder Beginner Contest 174 B Explication du problème "Distance" (C ++, Python, Java)
AtCoder Beginner Contest 177 B Explication du problème "Sous-chaîne" (Python3, C ++, Java)
[Explication AtCoder] Contrôle ABC180 Problèmes A, B, C avec Python!
Distribution de Poisson et tracé de distribution cumulative de Poisson via sqlite en Python et Java
Résolvez le livre en spirale (algorithme et structure de données) avec python!
AtCoder Beginner Contest 169 B Problème Explication "Multiplication 2" (Python3, C ++, Java)
Résoudre les problèmes d'AtCoder Boot camp pour les débutants (moyen 100) avec python
AtCoder ABC168 Une expression de cas résolue en Ruby et Python
[Explication AtCoder] Contrôle ABC164 Problèmes A, B, C avec Python!