AtCoder ABC127 D Hash mit Ruby 2.7.1 zu lösen

Einführung

Die frühere Problemumgebung von AtCoder wurde aktualisiert.

Dieses Thema

AtCoder Beginner Contest D - Integer Cards Difficulty: 891

Dieses Thema, Hash

Aufgrund des Problems handelt es sich um eine Prioritätswarteschlange, aber es scheint, dass die Einschränkungen locker sind und durch Sortieren gelöst werden können.

Lösung 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

Der Hash wird aus dem Array mit tally generiert.

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

Sie können die Parameter im Block nach Nummer angeben. Die Beschreibungsmethode von "sort_by" ist unbekannt.

Lösung 2 Hash

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

Es ist ein Schreibstil, der auch mit 2.3.3 übergeben werden kann.

Lösung 3 Array

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(:+)

Ich habe es um den Mai herum bestanden. Es scheint, dass es etwas schneller ist, wenn Sie diesmal bestehen.

2.3.3 2.7.1
Ausführungszeit(ms) 296 230

Lösung 4 Prioritätswarteschlange

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

Nimmt den Mindestwert des Heaps, vergleicht ihn und gibt ihn zurück.

_1 _2 _3 _4
Codelänge(Byte) 342 342 319 1236
Ausführungszeit(ms) 822 288 296 773
Erinnerung(KB) 34416 39264 21776 20824

Der nummerierte Parameter scheint nützlich zu sein.

Zusammenfassung

Referenzierte Site

Recommended Posts

AtCoder ABC127 D Hash mit Ruby 2.7.1 zu lösen
AtCoder ABC129 D 2D-Array In Ruby und Java gelöst
[Bei Coder] Lösen Sie das ABC182 D-Problem mit Ruby
AtCoder ARC 081 C-Hash, der in Ruby, Perl und Java gelöst werden muss
Atcoder ABC70 D Problem
AtCoder ABC 111 C Hash-Sortierung In Ruby, Perl und Java gelöst
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
Lösen mit Ruby, Perl und Java AtCoder ABC 129 C (Teil 1)
Ruby mit AtCoder 6 lernen [Contest 168 Daher]
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ruby mit AtCoder lernen 11 So erhalten Sie häufig verwendete Standardeingaben
[Anfänger] Lösen wir das AtCoder-Problem mit Ruby, während wir uns den Artikel ansehen!
Lösen Sie mit ac-library-rb AtCoder Union Find (DSU)
Lösen Sie ARC104 D Multiset Mean mit Scala, Java, C ++, Ruby, Perl, Elixir
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Lösen mit Ruby, Perl und Java AtCoder ABC 129 C (Teil 2) Dynamische Planungsmethode
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON
Ruby mit AtCoder lernen 12 So verwenden Sie die Standardausgabe richtig (p / put / print)
AtCoder Anfängerwettbewerb 169 A, B, C mit Rubin
AtCoder ABC 169 C Gleitkomma, das in Ruby passt
[Competition Pro] Löse Rucksackprobleme mit Ruby
Ruby mit AtCoder 9 lernen [1. Algorithmus Praktischer Test 3.] Sortieren von Array-Elementen
Ruby mit AtCoder 10 lernen [1. Algorithmus Praktischer Test DoubleCamelCase Sort]
Lösen mit Ruby AtCoder 1. Algorithmus Praktischer Test Eine Ausnahmebehandlung
Ruby-Lernen mit AtCoder 8 [1. Algorithmus-Praxistest-Doppelprüfung] Regulärer Ausdruck
Ruby mit AtCoder 6 lernen [Contest 168 Daher]
AtCoder ABC127 D Hash mit Ruby 2.7.1 zu lösen
Einführung in Ruby 2
[Ruby] Über das Abrufen von Hash
Löse Ruby TGIF
So erstellen Sie eine mit Ruby erstellte LINE-Messaging-Funktion
AtCoder Anfängerwettbewerb 170 A, B, C bis Rubin
Konvertieren von TSV-Dateien in CSV-Dateien (mit Stückliste) in Ruby