Ce thème, file d'attente prioritaire
Des problèmes tels qu'une version avancée des * [AtCoder ABC141 D Priority Queues Solved in Ruby, Python et Java] précédemment résolus (https://qiita.com/superrino130/items/a4795aa0d03090f06d8d) *.
Prend le maximum et le second maximum d'un tableau donné de la file d'attente, soustrait 1 et le remet dans la file d'attente. Répétez cette opération et quittez la boucle lorsque la file d'attente est inférieure à un.
Il existe également une solution mathématique.
ruby.rb
k = gets.to_i
a = gets.split.map(&:to_i).max
puts [0, 2 * a - k - 1].max
Je vais faire attention à la valeur maximale et la résoudre, mais la sensation de fraîcheur est incroyable. Ruby Heap
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
gets
a = gets.split.map(&:to_i)
h = Heap.new(up: true)
a.each do |x|
h.push(x)
end
while h.size > 1
u = h.pop
v = h.pop
h.push(u - 1) if u - 1 > 0
h.push(v - 1) if v - 1 > 0
end
if h.size == 0
puts "0"
else
puts h.pop - 1
end
up.rb
def initialize(up: false)
@up = up
heap.rb
while h.size > 1
u = h.pop
v = h.pop
h.push(u - 1) if u - 1 > 0
h.push(v - 1) if v - 1 > 0
end
Prenez-en deux, soustrayez-les et, s'ils sont 1 ou plus, remettez-les dans la file d'attente.
python.py
from sys import stdin
def main():
input = stdin.readline
k, _ = map(int, input().split())
a = max(map(int, input().split()))
print(max(0, 2 * a - k - 1))
main()
Python heapq
python.py
from sys import stdin
def main():
import heapq
input = stdin.readline
input()
a = [-1 * int(i) for i in input().split()]
heapq.heapify(a)
while len(a) > 1:
u = heapq.heappop(a)
v = heapq.heappop(a)
if u + 1 < 0:
heapq.heappush(a, u + 1)
if v + 1 < 0:
heapq.heappush(a, v + 1)
if len(a) == 0:
print(0)
else:
print(abs(a[0] + 1))
main()
Si l'opération est compliquée, il est préférable de préparer une fonction pour la conversion de code.
Solution mathématique Ruby | Ruby Heap | Solution mathématique Python | Python heapq | |
---|---|---|---|---|
Longueur du code(Byte) | 76 | 1120 | 184 | 458 |
Temps d'exécution(ms) | 7 | 26 | 17 | 22 |
Mémoire(KB) | 1788 | 1788 | 2940 | 3064 |
Site référencé
Recommended Posts