Résolution en Ruby, Python et Java AtCoder ABC141 D Priority Queue

introduction

Ce thème

AtCoder Beginner Contest D - Powerful Discount Tickets Difficulty: 826

Ce thème, file d'attente prioritaire Ruby L'opération elle-même est simple, sortez l'article le plus cher de la file d'attente, appliquez un bon de réduction et remettez-le dans la file d'attente. Dans chaque cas, effectuez la même opération pour l'article le plus cher jusqu'à épuisement du ticket de réduction. Cependant, dans l'implémentation qui trie simplement comme suit, ce sera «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(:+)

Les files d'attente prioritaires vous permettent de trouver les éléments les plus chers avec moins de calcul que de tri. C'est «heapq» en Python et «PriorityQueue» en Java, mais ce n'est pas en Ruby, donc * Je veux implémenter Priority Queue en Ruby * J'ai emprunté le code à et l'ai légèrement modifié.

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

Même ceci est la dernière 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))

«Heapq» de Python prend la valeur minimale, vous devez donc ajouter un signe négatif. De plus, comme la division négative par «//» renvoie la valeur avec la valeur absolue la plus élevée, «ceil» est utilisé ici. 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 prend en charge la valeur maximale avec reverseOrder ().

Ruby Python Java
Longueur du code(Byte) 1933 230 673
Temps d'exécution(ms) 1981 163 476
Mémoire(KB) 14004 14536 50024

Résumé

Site référencé

Recommended Posts

Résolution en Ruby, Python et Java AtCoder ABC141 D Priority Queue
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 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 ABC138 D Liste adjacente
Résolution avec Ruby, Python et networkx AtCoder ABC168 D Liste adjacente
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 065 C-th power
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 107 B Manipulation de chaînes
Simulation AtCoder ARC080 D résolue avec Ruby et Python
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 066 C Hash carré itératif
Résolution avec Ruby et Python AtCoder AISING2020 D Méthode carrée itérative
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
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, Perl, Java et Python AtCoder ATC 002 B
AtCoder ABC168 Une expression de cas résolue en Ruby et Python
Résolution avec Ruby, Python et numpy AtCoder ABC054 B Calcul de la matrice
Résolution avec Ruby et Python AtCoder ABC057 C Décomposition du facteur premier Recherche complète de bits
AtCoder ABC130 D Dichotomie de la somme cumulée résolue par Ruby et Python
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 098 C Somme cumulative
Résolution avec Ruby, Perl, Java et Python AtCoder CADDi 2018 C factorisation premier
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
Atcoder ABC164 A-C en Python
Résoudre avec Ruby et Python AtCoder ABC084 D Somme cumulative des nombres premiers
Résolution avec Ruby et Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
Atcoder ABC167 A-D en Python
Résoudre ABC175 D en Python
Atcoder ABC166 A-E en Python
AtCoder ABC 182 Python (A ~ D)
Atcoder ABC169 A-E en Python
AtCoder ABC177 A-D avec python
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 ARC 059 C Méthode du carré minimum
AtCoder ABC155 Problème D Pairs Review Note 2 NumPy et Python
Résolution avec Ruby et Python AtCoder ARC067 C factorisation premier
AtCoder ABC151 Problème D Comparaison de la vitesse en C ++ / Python / PyPy
Résoudre Atcoder ABC169 A-D avec Python
AtCoder ARC104 B Somme cumulative résolue en Ruby, Python et Java
Chevauchement d'expressions régulières en Python et Java
Différences entre Ruby et Python dans la portée
ABC 157 D - Résolvez les suggestions d'amis en Python!
Différences entre la syntaxe Python et Java
Résoudre AtCoder ABC168 avec python (A ~ D)
Résoudre ABC165 A, B, D avec Python
Résolution avec Ruby et Python AtCoder ABC172 C Dichotomie de somme cumulée
AtCoder ABC 174 Python
AtCoder ABC 175 Python
J'ai écrit une classe en Python3 et Java
Manipulation de chaîne C AtCoder ABC110 à résoudre dans Ruby
AtCoder # 36 quotidien avec Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 18 en Python
Daily AtCoder # 33 en Python
AtCoder # 7 tous les jours avec Python
AtCoder # 24 tous les jours avec Python
AtCoder # 8 tous les jours avec Python