Есть 2 компьютера A и B. Компьютер A может отправлять данные с x Мбайт/с и компьютером B в y MB/s.
Пример - Если x = 20, y = 10 и Z = 100, то минимальное время будет составлять 4 секунды, поскольку компьютер A может отправлять данные 80 МБ за 4 секунды, а B может отправлять 20 МБ за 2 секунды параллельно.
Алгоритм, приведенный ниже, имеет временную сложность O (n^2). Как мы можем решить это более эффективно?
Алгоритм для поиска наиболее эффективного способа отправки данных по отдельности
EDIT - Как это может быть сделано для русских компьютеров и найти данные, переданные с каждого компьютера?
Мое решение -
int main()
{
int x = 50;
int y = 10;
int Z = 200;
vector<int> xvec, yvec;
for(int i = x;i <= Z; i+= x)
{
xvec.push_back(i);
}
for(int i = y;i <= Z; i+= y)
{
yvec.push_back(i);
}
for(int i = 0; i < xvec.size(); i++)
{
for(int j = 0; j < yvec.size(); j++)
{
if(xvec[i] + yvec[i] >= Z)
{
cout << "min time : " << i+1;
exit(0);
}
}
}
}
Вы определили 'x' и' y', но что такое 'Z'? – MikeCAT
O (1) на 'time = (Z + (x + y) - 1)/(x + y)'? – MikeCAT
Я думаю, что целочисленное ограничение затрудняет. Без целочисленного ограничения решение составляет 3,33 секунды. Мы не можем просто округлить 3.33 до 4 и принять решение. Например, случай [x, y, z] = [2, 3, 4], Optima равен 0,8, но округление до 1 неверно, поскольку наилучшим возможным решением является (x * 2 + y * 0). – user3528438