HB World Ответов: 3

Мне нужен алго для этой проблемы ?


Шеф-повар является мульти-талантливый. Он разработал лекарство от коронавируса под названием CO-VAC-19. Теперь, когда все в мире заражены, пришло время эффективно распространить его по всему миру, чтобы стереть коронавирус с лица земли. Шеф-повар просто готовит лекарство, вы-его менеджер по дистрибуции.

In the world, there are N countries (numbered 1 through N) with populations a1,a2,…,aN. Each cure can be used to cure one infected person once. Due to lock down rules, you may only deliver cures to one country per day, but you may choose that country arbitrarily and independently on each day. Days are numbered by positive integers. On day 1, Chef has x cures ready. On each subsequent day, Chef can supply twice the number of cures that were delivered (i.e. people that were cured) on the previous day. Chef cannot supply leftovers from the previous or any earlier day, as the cures expire in a day. The number of cures delivered to some country on some day cannot превысить число инфицированных людей, которые в настоящее время у него есть, либо.

Однако коронавирус так просто не сдается. Он может заразить вылеченного человека, который снова вступает в контакт с инфицированным человеком ― формально это означает, что число инфицированных людей в стране удваивается в конце каждого дня, то есть после того, как используются лекарства для этого дня (очевидно, до населения этой страны).

Найдите минимальное количество дней, необходимое для того, чтобы сделать мир свободным от короны.

Что я уже пробовал:

Нам был дан отсортированный (в неубывающем порядке) список из N положительных целых чисел (A1, A2 , ...., An) и еще одного положительного целого числа X . Мы должны сделать все целые числа списка равными нулю, используя целое число X. Но для этого есть некоторые условия:
Условие 1 : за один раз мы можем вычесть X только до одного целого числа в списке (Ai).
Условие 2 : после каждой операции (условия 1) все целые числа списка удваиваются, а также X удваивается.
Условие 3 : Если X больше Ai, то значение X изменяется на Ai, а затем происходит вычитание.

Что нужно найти : нам нужно найти минимальные операции, чтобы сделать все целые числа в списке нулевыми.

Образец для лучшего понимания :

List : 1 2 3 4 5 

X : 4


Здесь, чтобы найти наиболее оптимальное решение, мы сначала сделаем 4 в ноль, используя X.
Operation cost = 1

Теперь каждое целое число будет удвоено, следовательно, новый список будет
2 4 6 0 10, X = 8 
2 4 6 0 2, X = 8 (subtracting 10 - 8) Operation cost = 2

Опять же каждая вещь удваивается так что новый список это
4 8 12 0 4 , X = 16
4 8 0 0 4, X = 12` (as 12 < 16, X becomes 12) Operation cost = 3 

Опять же каждая вещь удваивается так что новый список это
8 16 0 0 8, X = 24 
8 0 0 0 8, X = 16  (as 16 < 24, X becomes 16) Operation cost = 4 

Опять же каждая вещь удваивается так что новый список это
16 0 0 0 16, X = 32
16 0 0 0 0, X = 16 (как 16 < 32, X становится 16) эксплуатационные расходы = 5
Опять же каждая вещь удваивается так что новый список это
32 0 0 0 0, X = 32 
0 0 0 0 0, X = 32  (as 32 <= 32, X becomes 32) Operation cost = 6


Итак, в итоге за 6 операций мы сделали список нулевым.
Еще несколько случаев с ответами :

List : 10 20 30 40 50
X : 1
Answer : 9


List : 1 20 110
X : 10
Answer : 6


Constraints :  (1 <= Ai<= 1000000000) , (1 <= X <= 1000000000)

Свой подход

- Позволять
a
будьте целым числом в списке, и x дано, чтобы превратить " а " в ноль.
- Теперь после каждой операции будет формироваться серия, как указано ниже
(a-x) , (2(a-x) - 2x) , (2(2(a-x) - 2x) - 4x) , ..........
  (a-x) , (2a - 4x) , (4a - 12x), (8a - 32x) , .....
  (a-x) , 2(a-2x) , 4(a-3x) , 8(a-4x) , .......
  an = (2^(n-1))(a-nx) | where an is nth term


Так что сделать
An == 0 , A-nx = 0, A = n/x 


Я выяснил, как сделать любое единственное целое число нулевым с помощью x, но я не могу понять, как сделать список нулевым с минимальными операциями, так как я должен сделать код для этого также, Так что мне нужен базовый алгоритм, который может быть использован для решения этой проблемы.
Может ли кто-нибудь помочь мне с этим ??

Patrice T

Конкурс от https://www.codechef.com/JULY20B/problems/DRCHEF[^]

3 Ответов

Рейтинг:
2

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Подумайте о проблеме, попробуйте ее вручную с небольшими числами и посмотрите, что вы можете решить - мы здесь не для того, чтобы "сдавать тесты" для вас, даже если они не являются "формальным домашним заданием", как вы
не учитесь ничему на собственном опыте, если мы это сделаем!


Рейтинг:
16

Member 14885214

Вы задали неправильный вопрос. Ваш примерный тестовый случай неверен. Он не может выйти за пределы данной популяции, поэтому он никогда не сможет выйти за пределы 1,2,3,4,5, как это сделали вы: 2,4,6,8,10 эти числа не могут быть сформированы.

В принципе, ваш ответ на этот тестовый случай должен был быть 5.


Рейтинг:
11

Member 14887402

импорт heapq в качестве штаб-квартиры
for _ in range(int(input())):
d=0
t=0
c=0
n,x=map(int,input().split())
а=список(карта(инт входного сигнала().сплит()))
шк.heapify(а)
a=[hq.heappop(a) для i в диапазоне(len(a))]
если x в a:
т=а.показатель(х)
еще:
для меня в:
если x>i:
c+=1
t=c
для i в диапазоне(t,n,1):
если x<a[i]:
в то время как x<a[i]:
x=2*x
d+=1
d+=1
еще:
d+=1
x=2*a[i]
t1=t+d
если t!=0:
d=0
t=t-1
для i в диапазоне(t,n,1):
если x<a[i]:
в то время как x<a[i]:
x=2*x
d+=1
d+=1
еще:
d+=1
x=2*a[i]
если d+t<t1:
печать(d+t)
еще:
печать(t1)
еще:
печать(t1)


Patrice T

Воспользуйся Улучшите решение чтобы обновить ваш вопрос.
При улучшении:
- Выберите весь код
- Наведите курсор на код кнопки и нажмите на кнопку Ява во всплывающем окне

Пара предложений тоже будет оценена по достоинству.