using
System;
using
System.Collections.Generic;
public
class
Program
{
public
static
int
MakeitMin(
int
n,
int
k,
int
[] a,
int
[] b)
{
var
pq =
new
PriorityQueue<(
int
,
int
)>((x, y) => x.Item1.CompareTo(y.Item1));
for
(
int
i = 0; i < n; i++)
{
pq.Enqueue((a[i] - b[i], i));
}
int
ans = 0;
while
(pq.Count > 0 && k >= 0)
{
var
item = pq.Dequeue();
int
idx = item.Item2;
int
max_ops = (k - (a[idx] - b[idx])) / (a[idx] - b[idx]);
ans += max_ops;
k -= max_ops * (a[idx] - b[idx]);
if
(max_ops > 0 && k >= 0)
{
pq.Enqueue((a[idx] - b[idx], idx));
}
}
return
ans;
}
public
static
void
Main()
{
int
N = 2, K = 10;
int
[] A = { 5, 4 };
int
[] B = { 1, 2 };
Console.WriteLine(MakeitMin(N, K, A, B));
}
}
public
class
PriorityQueue<T>
{
private
readonly
List<T> _data;
private
readonly
Comparison<T> _comparer;
public
PriorityQueue() :
this
(
null
) { }
public
PriorityQueue(Comparison<T> comparer)
{
_data =
new
List<T>();
_comparer = comparer ?? Comparer<T>.Default.Compare;
}
public
void
Enqueue(T item)
{
_data.Add(item);
int
ci = _data.Count - 1;
while
(ci > 0)
{
int
pi = (ci - 1) / 2;
if
(_comparer(_data[ci], _data[pi]) >= 0)
break
;
T tmp = _data[ci]; _data[ci] = _data[pi]; _data[pi] = tmp;
ci = pi;
}
}
public
T Dequeue()
{
int
li = _data.Count - 1;
T frontItem = _data[0];
_data[0] = _data[li];
_data.RemoveAt(li);
--li;
int
ci = 0;
while
(
true
)
{
int
rc = ci * 2 + 2;
int
lc = ci * 2 + 1;
if
(lc > li)
break
;
int
minc = (rc > li || _comparer(_data[lc], _data[rc]) < 0) ? lc : rc;
if
(_comparer(_data[ci], _data[minc]) <= 0)
break
;
T tmp = _data[ci]; _data[ci] = _data[minc]; _data[minc] = tmp;
ci = minc;
}
return
frontItem;
}
public
int
Count {
get
{
return
_data.Count; } }
}