oj说答案错误,边界 处理了,防止溢出开了long long的数组,实在找不出哪里错了,你们能看出哪里错了吗,必采纳
#include <iostream>
using namespace std;
typedef long long ll;
ll L[100005]; //储存原木的长度
ll n, k, l, r,mid,cnt,ans,Max = 0,sum = 0;
ll check(ll x)
{
cnt = 0;
for (ll i = 1; i <= n; ++i)
{
cnt += L[i] / x; //循环累加取整数求出段数
}
if (cnt > k) //段数多了
{
return 1;
}
else if (cnt == k)
{
ans = x; //答案符合要求,保存当时的长度答案
return 0;
}
else return -1; //段数少了
}
int main()
{
cin >> n >> k;
for (ll i = 1; i <= n; ++i)
{
cin >> L[i];
if (L[i] > Max) Max = L[i]; //找出原木的最大长度,作为答案的右边界
sum += L[i]; //求出长度总和
}
if (sum < k) //总和小于段数,1cm也切不出,直接输出0
{
cout << 0;
return 0;
}
l = 0; //最少为0cm
r = Max; //最多设为n根原木中的最大长度
while (l < r)
{
mid = (l + r + 1) >> 1; //可能会溢出
if (check(mid) == 0 || check(mid) == 1) //段数多了,说明长度太短了,增大一点;如果刚好相等,继续增大长度,找最优解
{
l = mid;
}
else if (check(mid) == -1) //段数少了,说明长度太长了,减小一点
{
r = mid - 1;
}
}
cout << ans;
return 0;
}