В настоящее время у меня есть проблема, в которой у нас есть два массива, скажем x=[x1,x2,x3,...,xn]
и массив y=[y1,y2,y3,...,yn]
и значение, скажем, k.Теперь я должен сгенерировать массив скажем z=[z1,z2,z3,...,zn]
из k, такой, что z1+z2+z3...+zn=k
.Для разных сгенерированных z, что будет минимальным значением max [(x1-z1)*y1, (x2-z2)*y2, (x3-z3)*y3, ...., (xn-zn)*yn]
.т.е. минимальное значение максимум (x[i]-z[i])*y[i]
.Например, если x=[2,3,4,1,6]
и y=[3,5,2,7,3]
и k = 4, то взятие z=[0,1,0,0,3]
дает массив [6,10,8,7,9]
, для которого максимум равен 10
, что также является минимальным максимумом.
Я разработал алгоритм, который вычисляет его в O(nlog(n)+k)
. Вот если k будет очень большим, чем мой алгоритм будет неэффективным.Можем ли мы сделать это в O(n)
или O(nlog(n))
.Мой текущий алгоритм:
1. l=[] //initialize empty array
2. for i from 0 to n:
l.append(x[i]*y[i],y[i])
3. Sort l in decreasing order of (x[i]*y[i])
4. while(m>0):
num=l[0][0]-l[1][0] //take difference of two largest x[i]*y[i]
t=(num/l[0][1])+1 //Choose appropriate number to subtract to minimize
the maximum
t=max(0,t) // t must not be negative
l[0][0]=l[0][0]-t*l[0][1]
Put l[0] at correct position in sorted list l //Since value of
l[0][0] has
changed we will
place it at
correct position
in already sorted
l (using binary
search)
m=m-t
5.Print l[0][0] as the minimum maximum