题目描述 Description
牛牛家有一个林场,现有 n 条木材,每条木材的长度已知且均为正整数。木材可以以任意正整数长度切割,但不可以连接。假设木材直径都一致,现有卡车可装m条木材,但是卡车长度有限,现在要从这些木材中切割出 m 条长度相同的木材,为经济效益最大化,应该选择多长的卡车,求这些木材的最大长度是多少。
输入描述 Input Description
第一行是一个不超过 100 的正整数 n。
第二行是 n 个不超过10^6的正整数,表示每条木材的长度。
第三行是一个不超过10^8的正整数 m。
输出描述 Output Description
可以切割出的木材(注:真题描述为“绳段”)的最大长度,若无法切割,输出“Failed”。
样例输入 Sample Input
3 30 20 55 4
样例输出 Sample Output
20
这道题目是包河区的压轴题,难度非常大,用求解转判定的方法太难,所以我们可以考虑用二分:
先把定义搞好
int a[100005];
int n,m,l,r=100000001;//二分的一些变量,不知道的可以去网上学一学,这个是算法中期的内容,很难
然后是输入
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
接下来就是重要的部分了,这个和普通的二分不一样,他在普通的二分框架还要加一个循环
while(r-l>1){
int mid=(l+r)/2;
int sum=0;
for(int i=1;i<=n;i++){
sum+=a[i]/mid;
}
if(sum>=m){
l=mid;
}else{
r=mid;
}
}
最后的二分判断我就讲一下思路吧
如果(l==0){
输出;//题目要求的输出的单词
}否则{
输出
}
全部的代码我就不发了,大家看我的题解不要赋值完整代码,题解的真正意义是懂得这道题!