AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1

introduction

L'environnement des problèmes passés d'AtCoder a été mis à niveau.

Ce thème

AtCoder Beginner Contest D - Integer Cards Difficulty: 891

Ce thème, hash

D'après le problème, c'est une file d'attente prioritaire, mais il semble que les restrictions sont lâches et il peut être résolu par le tri.

Solution 1 Hash (2.7.1)

ruby.rb


n, m = gets.split.map(&:to_i)
h = gets.split.map(&:to_i).tally
m.times do
  b, c = gets.split.map(&:to_i)
  if h.key?(c)
    h[c] += b
  else
    h[c] = b
  end
end
ans = 0
cnt = 0
h.sort{_2 <=> _1}.each do |k, v|
  if cnt + v < n
    ans += k * v
    cnt += v
  else
    ans += k * (n - cnt)
    break
  end
end
puts ans

tally.rb


h = gets.split.map(&:to_i).tally

Le hachage est généré à partir du tableau avec «tally».

numberedparameter.rb


h.sort{_2 <=> _1}.each do |k, v|       # after 2.7.1

h.sort{|a, b| b <=> a}.each do |k, v|  # before

Vous pouvez spécifier les paramètres du bloc par numéro. La méthode de description de sort_by est inconnue.

Hachage de la solution 2

ruby.rb


n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
h = Hash.new(0)
a.each do |x|
  h[x] += 1
end
m.times do
  b, c = gets.split.map(&:to_i)
  h[c] += b
end
ans = 0
cnt = 0
h.sort_by{|k, v| -k}.each do |k, v|
  if cnt + v < n
    ans += k * v
    cnt += v
  else
    ans += k * (n - cnt)
    break
  end
end
puts ans

C'est un style d'écriture qui peut être passé même avec 2.3.3.

Baie de la solution 3

ruby.rb


n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
h = []
m.times do
  h << gets.split.map(&:to_i)
end
i = 0
h.sort_by{|u, v| -v}.each do |x, y|
  break if a[i] >= y
  x.times do
    a[i] = y
    i += 1
    break if i >= n
    break if a[i] >= y
  end
  break if i >= n
end
puts a.inject(:+)

Je l'ai fait passer vers le mois de mai. Il semble que ce soit un peu plus rapide si vous passez cette fois.

2.3.3 2.7.1
Temps d'exécution(ms) 296 230

Solution 4 File d'attente prioritaire

ruby.rb


class Heap
  attr_reader :size
  def initialize(up: false)
    @up = up
    @heap = []
    @size = 0
  end
  def sum
    x = 0
    @size.times do |i|
      x += @heap[i]
    end
    x
  end
  def push(n)
    n = -n if @up
    i = @size
    while i > 0
      pid = (i - 1) / 2
      break if n >= @heap[pid]
      @heap[i] = @heap[pid]
      i = pid
    end
    @heap[i] = n
    @size += 1
  end
  def pop
    return nil if @size == 0
    top = @heap[0]
    @size -= 1
    n = @heap[@size]
    i = 0
    while i * 2 + 1 < @size
      cid1 = i * 2 + 1
      cid2 = cid1 + 1
      if cid2 < @size && @heap[cid2] < @heap[cid1]
        cid1 = cid2
      end
      break if @heap[cid1] >= n
      @heap[i] = @heap[cid1]
      i = cid1
    end
    @heap[i] = n
    if @up
      -top
    else
      top
    end
  end
end

_, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
b = Array.new(m){gets.split.map(&:to_i)}
h = Heap.new(up: false)
a.each do |x|
  h.push(x)
end
f = false
b.sort_by{|x, y| -y}.each do |x, y|
  x.times do
    u = h.pop
    if y > u
      h.push(y)
    else
      h.push(u)
      f = true
    end
    break if f
  end
  break if f
end
puts h.sum

Prend la valeur minimale du tas, la compare et la renvoie.

_1 _2 _3 _4
Longueur du code(Byte) 342 342 319 1236
Temps d'exécution(ms) 822 288 296 773
Mémoire(KB) 34416 39264 21776 20824

Le paramètre numéroté semble être utile.

Résumé

Site référencé

Recommended Posts

AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1
Tableau 2D AtCoder ABC129 D résolu en Ruby et Java
[At Coder] Résolvez le problème ABC182 D avec Ruby
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
Problème atcoder ABC70 D
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 1)
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Apprendre Ruby avec AtCoder 11 Comment recevoir une entrée standard souvent utilisée
[Débutant] Résolvons le problème d'AtCoder avec Ruby en regardant l'article!
Résoudre avec ac-library-rb AtCoder Union Find (DSU)
Résoudre la moyenne multiset ARC104 D avec Scala, Java, C ++, Ruby, Perl, Elixir
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 2) Méthode de planification dynamique
Conversion de JSON en TSV et TSV en JSON avec Ruby
Apprendre Ruby avec AtCoder 12 Comment utiliser correctement la sortie standard (p / met / print)
AtCoder Beginner Contest 169 A, B, C avec rubis
AtCoder ABC 169 C virgule flottante qui tient dans Ruby
[Competition Pro] Résolvez les problèmes de sac à dos avec Ruby
Apprendre Ruby avec AtCoder 9 [1er test pratique d'algorithme 3ème] Tri des éléments du tableau
Apprendre Ruby avec AtCoder 10 [1er test pratique d'algorithme DoubleCamelCase Sort]
Résolution avec Ruby AtCoder 1er test pratique de l'algorithme Une gestion des exceptions
Apprendre Ruby avec AtCoder 8 [1er test pratique de l'algorithme double vérification] Expression régulière
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1
Introduction à Ruby 2
[Ruby] À propos de la récupération du hachage
Résoudre Ruby TGIF
Comment créer une fonction de messagerie LINE avec Ruby
AtCoder Beginner Contest 170 A, B, C jusqu'au rubis
Conversion du fichier TSV en fichier CSV (avec BOM) en Ruby