两份代码,一份是大神的思路,一份是我队友写的,感觉大神的二分思路很不好想,想象一个矩形,宽为m,长为时间,如果矩形内可以装得下sum,那么就可以,初始两个边界分别是最大值和sum。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int T, m, n;
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
int tmp, _max;
long long sum, res, mid;
sum = _max = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &tmp);
_max = max(_max, tmp);
sum += tmp;
}
long long l = _max, r = sum;
while(l <= r)
{
mid = (l + r) >> 1;
if(mid * m >= sum)
{
res = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%lld\n", res);
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
long long n,m;
cin >> n >> m;
int i, j;
int ma = 0;
long long s = 0;
int tmp;
for(i = 1; i <= n; i++)
{
cin >> tmp;
ma = max(ma, tmp);
s += tmp;
}
long long t = s / m;
if(s % m != 0)
t++;
if(t <= ma)
t = ma;
cout << t << endl;
}
return 0;
}