C++编程,用简单的思路简单的代码: 小猴有 n 台机器需要安装更新文件,开始时仅有 1 号电脑有更新文件。 在每一个小时内,已安装文件的机器可以通过一条电缆把文件传给另一个未安装文件的电脑。小猴只有 k 条电缆,也就是说每个小时至多只能有 k 台电脑进行传输。 请你帮助小猴计算所有机器都接受到更新文件需要多少小时。 【输入格式】 第一行一个整数 T,表示有 T 组输入数据; 每组数据一行,两个整数n,k。 【输出格式】 每组数据,输出一个整数。 【数据范围】 对于50% 的数据: 1≤T≤100, 1≤k≤n≤10^9; 对于100% 的数据: 1≤T≤10^5,1≤k≤n≤10^18。
时间: 2024-02-27 09:52:11 浏览: 132
以下是C++的代码实现:
```cpp
#include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
long long n, k;
cin >> n >> k;
if (n == 1)
{
cout << 0 << endl;
continue;
}
if (k >= n - 1)
{
cout << 1 << endl;
continue;
}
long long left = 1, right = n - 1, mid, ans;
while (left <= right)
{
mid = (left + right) / 2;
if (mid * (mid + 1) / 2 + k * mid >= n)
{
ans = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
cout << ans << endl;
}
return 0;
}
```
代码思路:
对于每组数据,我们首先判断特殊情况:
- 当 n=1 时,已经有了更新文件,所以不需要任何时间,输出 0;
- 当 k≥n-1 时,只需要一小时就能将所有机器更新,输出 1。
对于一般情况,我们考虑二分答案,设需要的时间为 t。我们可以模拟每个小时的传输过程,将已更新的机器文件传输给未更新的机器。在 t 小时后,能够更新的机器数量应该是:
$$
1+k+2k+3k+...+tk=\frac{t(t+1)}{2}k+1
$$
如果这个数量大于等于 n,说明 t 小时内可以完成更新,我们更新答案为 t,并将右边界缩小;否则 t 小时内无法完成更新,我们将左边界增大。最终得到的答案即为最小需要的时间。
时间复杂度:$O(\log n)$
阅读全文