Lösen in Ruby, Python und Java AtCoder ABC141 D Priority Queue

Einführung

Dieses Thema

AtCoder Beginner Contest D - Powerful Discount Tickets Difficulty: 826

Dieses Thema, Prioritätswarteschlange Ruby Der Vorgang selbst ist einfach: Nehmen Sie den teuersten Artikel aus der Warteschlange, legen Sie einen Rabattgutschein ein und stellen Sie ihn wieder in die Warteschlange. Führen Sie in jedem Fall den gleichen Vorgang für den teuersten Artikel aus, bis das Rabattticket aufgebraucht ist. In der Implementierung, die einfach wie folgt sortiert wird, ist es jedoch "TLE".

ruby_tle.rb


n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
a.sort_by!{|x| -x}
m.times do
  b = a.shift
  b /= 2
  a << b
  a.sort_by!{|x| -x}  
end
puts a.inject(:+)

Mit Prioritätswarteschlangen können Sie die teuersten Elemente mit weniger Rechenaufwand als beim Sortieren finden. Es ist "Heapq" in Python und "PriorityQueue" in Java, aber nicht in Ruby, also * Ich möchte Priority Queue in Ruby implementieren * Ich habe den Code von ausgeliehen und ein wenig geändert.

ruby.rb


class PriorityQueue
  def initialize(array = [])
    @data = []
    array.each{|a| push(a)}
  end

  def push(element)
    @data.push(element)
    bottom_up
  end

  def pop
    if size == 0
      return nil
    elsif size == 1
      return @data.pop
    else
      min = @data[0]
      @data[0] = @data.pop
      top_down
      return min
    end
  end

  def size
    @data.size
  end

  private

  def swap(i, j)
    @data[i], @data[j] = @data[j], @data[i]
  end

  def parent_idx(target_idx)
    (target_idx - (target_idx.even? ? 2 : 1)) / 2
  end

  def bottom_up
    target_idx = size - 1
    return if target_idx == 0
    parent_idx = parent_idx(target_idx)
    while (@data[parent_idx] > @data[target_idx])
      swap(parent_idx, target_idx)
      target_idx = parent_idx
      break if target_idx == 0
      parent_idx = parent_idx(target_idx)
    end
  end

  def top_down
    target_idx = 0

    while (has_child?(target_idx))

      a = left_child_idx(target_idx)
      b = right_child_idx(target_idx)

      if @data[b].nil?
        c = a
      else
        c = @data[a] <= @data[b] ? a : b
      end

      if @data[target_idx] > @data[c]
        swap(target_idx, c)
        target_idx = c
      else
        return
      end
    end
  end

  # @param Integer
  # @return Integer
  def left_child_idx(idx)
    (idx * 2) + 1
  end

  # @param Integer
  # @return Integer
  def right_child_idx(idx)
    (idx * 2) + 2
  end

  # @param Integer
  # @return Boolent
  def has_child?(idx)
    ((idx * 2) + 1) < @data.size
  end
end

n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
e = a.map{|x| -x}
b = PriorityQueue.new(e)
m.times do
  c = b.pop
  b.push(-(-c / 2))
end
ans = 0
while b.size > 0
  ans -= b.pop
end
puts ans

Auch dies ist die letzte Minute. Python

python.py


import heapq
import math

n, m = map(int, input().split())
a = [-1 * int(i) for i in input().split()]
heapq.heapify(a)
for _ in range(m):
    b = heapq.heappop(a)
    heapq.heappush(a, math.ceil(b / 2))
print(-1 * sum(a))

Pythons heapq nimmt den Mindestwert an, daher müssen Sie ein negatives Vorzeichen hinzufügen. Da die negative Division durch "//" den Wert mit dem größeren absoluten Wert zurückgibt, wird hier auch "Ceil" verwendet. 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());
        int M = Integer.parseInt(sc.next());
        PriorityQueue<Long> A = new PriorityQueue<>(Collections.reverseOrder());
        for (int i=0; i<N; i++) {
            A.add(Long.parseLong(sc.next()));
        }
        sc.close();

        for (int i=0; i<M; i++) {
            long new_price = (long)A.poll()/2;
            A.add(new_price);
        }

        long sum = 0;
        for (long a : A) {
            sum += a;
        }
        System.out.println(sum);
    }
}
        PriorityQueue<Long> A = new PriorityQueue<>(Collections.reverseOrder());

Java unterstützt den Maximalwert mit reverseOrder ().

Ruby Python Java
Codelänge(Byte) 1933 230 673
Ausführungszeit(ms) 1981 163 476
Erinnerung(KB) 14004 14536 50024

Zusammenfassung

Referenzierte Site

Recommended Posts

Lösen in Ruby, Python und Java AtCoder ABC141 D Priority Queue
AtCoder ABC 165 D Bodenfunktion in Ruby, Perl, Java und Python gelöst
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 131 D Sortieren von Arrays
Lösen mit Ruby und Python AtCoder ABC178 D Dynamische Planungsmethode
Lösen mit Ruby und Python AtCoder ABC151 D Suche nach Breitenpriorität
Lösen mit Ruby und Python AtCoder ABC138 D Benachbarte Liste
Lösen mit Ruby, Python und networkx AtCoder ABC168 D Benachbarte Liste
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 065 C-te Potenz
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 107 B String-Manipulation
AtCoder ARC080 D Simulation mit Ruby und Python gelöst
Lösen mit Ruby, Perl, Java und Python AtCoder ARC 066 C Iterativer Square Hash
Lösen mit Ruby und Python AtCoder AISING2020 D Iterative Square-Methode
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 A.
Lösen mit Ruby und Python AtCoder ABC011 C Dynamische Planungsmethode
Lösen mit Ruby und Python AtCoder ABC153 E Dynamische Planungsmethode
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 B.
AtCoder ABC168 Ein in Ruby und Python gelöster Fallausdruck
Lösen mit Ruby, Python und numpy AtCoder ABC054 B Matrixberechnung
Lösen mit Ruby und Python AtCoder ABC057 C Zerlegung des Primfaktors Bit vollständige Suche
AtCoder ABC130 D Kumulative Summen-Dichotomie, gelöst durch Ruby und Python
Lösen mit Ruby, Perl, Java und Python AtCoder ARC 098 C Kumulative Summe
Lösen mit Ruby, Perl, Java und Python AtCoder CADDi 2018 C Primfaktorisierung
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 047 C Regulärer Ausdruck
Lösen mit Ruby, Perl, Java und Python AtCoder ARC 086 C Hash-Sortierung
Atcoder ABC164 A-C in Python
Lösen mit Ruby und Python AtCoder ABC084 D Kumulative Summe der Primzahlen
Lösen mit Ruby und Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
Atcoder ABC167 A-D in Python
Löse ABC175 D in Python
Atcoder ABC166 A-E in Python
AtCoder ABC 182 Python (A ~ D)
Atcoder ABC169 A-E in Python
AtCoder ABC177 A-D mit Python
Lösen mit Ruby, Perl, Java und Python AtCoder diverta 2019 Programmierwettbewerb C String Manipulation
Lösen mit Ruby und Python AtCoder ARC 059 C Minimum-Quadrat-Methode
AtCoder ABC155 Problem D Pairs Review Note 2 NumPy und Python
Lösen mit Ruby und Python AtCoder ARC067 C Primfaktorisierung
AtCoder ABC151 Problem D Geschwindigkeitsvergleich in C ++ / Python / PyPy
Löse den Atcoder ABC169 A-D mit Python
AtCoder ARC104 B Kumulative Summe in Ruby, Python und Java gelöst
Überlappende reguläre Ausdrücke in Python und Java
Unterschiede zwischen Ruby und Python im Umfang
ABC 157 D - Lösungsvorschläge für Freunde in Python!
Unterschiede zwischen Python- und Java-Syntax
Löse AtCoder ABC168 mit Python (A ~ D)
Löse ABC165 A, B, D mit Python
Lösen mit Ruby und Python AtCoder ABC172 C Kumulative Summen-Dichotomie
AtCoder ABC 174 Python
AtCoder ABC 175 Python
Ich habe eine Klasse in Python3 und Java geschrieben
AtCoder ABC110 C-String-Manipulation zum Lösen in Ruby
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 18 in Python
Täglicher AtCoder # 33 in Python
Täglicher AtCoder # 7 in Python
AtCoder # 24 jeden Tag mit Python
AtCoder # 8 jeden Tag mit Python