二分答案
2026-07-15 19:52:26
发布于:广东
小码酱砍树
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int n,m;
bool check(int h){
long long sum = 0;//总木材数量
for(int i=1;i<=n;i++){
if(a[i]>h)sum+=a[i]-h;
}
if(sum>=m)return true;
return false;
}
int main(){
cin>>n>>m;//要求木材数量
int mx = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
mx = max(mx,a[i]);
}
int l = 0,r = mx,ans = mx;
//锯片高度在满足条件下 越大越好
while(l<=r){
int mid = (l+r)/2;
if(check(mid)){
l = mid + 1;
ans = mid;
}else{
r = mid - 1;
}
}
cout<<ans;
return 0;
}
蛋糕


梯形摆放


城市
//1. check 函数
//2. l ,r 上限下限
//3. while循环
//4. 判断check
//5. l,r移动
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int n,m;
bool check(int x){
long long sum = 0;
for(int i=1;i<=n;i++)sum += (a[i] + x - 1) / x; // 向上取整 ceil
if(sum<=m)return true;
return false;
}
int main(){
while(true){
cin>>n>>m;
if(n==-1 && m==-1)return 0;
for(int i=1;i<=n;i++)cin>>a[i];
int l = 1, r = 5e6,ans = 0;
while(l<=r){
int mid = (l+r)/2;
if(check(mid)){
r = mid - 1;
ans = mid;
}else {
l = mid + 1;
}
}
cout<<ans<<endl;
}
}
全部评论 28
11111111111111111111111111111111111111111111111111111111111
8小时前 来自 广东
1我张云景跪了·快点赞刷评论
14小时前 来自 广东
1快点赞,不然我张云景不客气
14小时前 来自 广东
1站点掉,傲世间,有我老师便有天
14小时前 来自 广东
1老师无敌
14小时前 来自 广东
1老师牛逼
14小时前 来自 广东
11836487265872648756749265987346875364565
14小时前 来自 广东
1快跟我刷榜一
14小时前 来自 广东
11
7小时前 来自 浙江
01
7小时前 来自 浙江
01
7小时前 来自 浙江
01
7小时前 来自 浙江
0
8小时前 来自 广东
01
8小时前 来自 广东
0111111111111111111111111111111111111111111111111111111111111
8小时前 来自 广东
01
8小时前 来自 广东
01
8小时前 来自 广东
011
8小时前 来自 广东
01
8小时前 来自 广东
01
8小时前 来自 广东
0




























有帮助,赞一个