思路和第一篇题解差不多
#include <iostream>
#include <algorithm>
using namespace std;
int l, m, n, d[50005], lft, rgt;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> l >> n >> m;
for (int i = 1; i <= n; i++)
cin >> d[i];
d[n + 1] = l;
if (n == m)
{
cout << l << "\n";
return 0;
}
sort(d, d + n + 2);
lft = 0, rgt = l;
while (rgt - lft > 1)
{
int mid = (lft + rgt) >> 1;
if (judge(mid))
lft = mid;
else
rgt = mid;
}
cout << lft << "\n";
return 0;
}
不同的地方在于judge()函数:
bool judge(int x)
{
int last = 0, cnt = 0;
while (true)
{
for (int i = last + 1; i <= n; i++)
{
if (d[i] - d[last] >= x)
{
last = i;
cnt++;
break;
}
if (cnt == n - m)
return true;
if (i == n)
return false;
}
if (cnt == n - m)
return true;
}
}
bool judge(int x)
{
int last = 0, cnt = 0;
for (int j = 1; j <= n - m; j++)
{
for (int i = last + 1; i <= n; i++)
{
if (d[i] - d[last] >= x)
{
last = i;
cnt++;
break;
}
if (i == n)
return false;
}
}
return true;
}
bool judge(int x)
{
int num = n - m, last = 0;
for (int i = 0; i < num; i++)
{
int cur = last + 1;
while (cur <= n && d[cur] - d[last] < x)
cur++;
if (cur > n || d[n + 1] - d[cur] < x)
return false;
last = cur;
}
return true;
}
前面两种为什么有问题呢?求大佬解答