落谷 P1873
一个二分查找
#include<iostream>
using namespace std;
#include<algorithm>
#include<cmath>
typedef long long ll;
ll n;
ll m;
ll a[1000005];
ll ans = 0;
int main()
{
cin >> n >> m;
for (ll i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
ll max_ = a[n - 1];
//cout << max_ << endl;
ll l = a[0];
ll r = max_;
ll mid = (r + l) / 2;
while (l <= r)
{
ans = 0;
for (ll i = 0; i < n; i++)
{
if (mid < a[i])
{
ans = ans + a[i] - mid;
}
}
//cout << "mid:" << mid << "ans:" << ans << endl;
if (ans == m)
{
break;
}
if (ans < m)
{
r = mid - 1;
mid = (r + l) / 2;
}
if (ans > m)
{
l = mid + 1;
mid = (r + l) / 2;
}
}
cout << mid;
return 0;
}
该代码实现了一个二分查找算法,通过寻找特定值在排序数组中使得总距离等于给定目标值的分割点。输入包括一个整数数组和一个目标距离,输出是能够达到目标距离的分割点。算法首先找到数组的最大值,然后逐步缩小搜索范围,更新答案并调整搜索边界,直到找到符合条件的分割点。
1121

被折叠的 条评论
为什么被折叠?



