题解
2024-03-19 20:11:20
发布于:陕西
2阅读
0回复
0点赞
#include<bits/stdc++.h>
#define ll long long
//这里意思是将long long缩写为ll,省点力气
using namespace std;
const int N = 300000 + 10;
ll n, m, l, r, ans, mid, a[N];
bool check(ll x){
ll sum = 0;
for(int i=1;i<=m;i++){
sum += a[i] / x;
if(a[i] % x != 0) sum++;
//也有题解写成 sum+=(a[i]+x-1)/x,是等价的
}
return sum <= n;//人数是否达标?
}
int main(){
cin >> n >> m;
for(int i=1;i<=m;i++){
cin >> a[i];
r += a[i];//确定右边界,嫉妒值极限为所有球之和
}
while(l <= r){//开始二分
mid = (l + r) >> 1;//等价于 /2
if(check(mid)){//返回true意味着可以考虑更大些
r = mid - 1;
ans = mid;
}else l = mid + 1;//返回false意味着要小些
}
cout << ans << endl;//输出答案
return 0;
}
这里空空如也
有帮助,赞一个