有N个苹果排成一行,重量分别是w1,w2,w3,…,wn。现在要把它们按照次序装进相同规格的箱子里,每个箱子最多可以装M重量的苹果,问最少要几个箱子把所有苹果装起来?
这个问题显然可以贪心算法解决:每次一个一个放苹果,直到放不下,就增加一个箱子。
如果问题反过来,知道现在要定制K个箱子,问箱子的规格最小是多少(即箱子的重量限制最小是多少),才能把所有苹果装起来?
输入格式 第一行2个正整数:N和K。N表示有多少苹果,范围[1, 100000];K表示定制的箱子数量。
第二行有N个数,表示每个苹果的重量,范围[1, 1000]
我代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,sum,a[100001];
bool pd(int x){
int sl=0;
for (int i=1;i<=n;){
int s=a[i];
while (s+a[++i]<=x);
sl++;
}
if (sl==k) return 1;
else return 0;
}
int find(){
int l=1,r=sum;
while (l<r){
int mid=(l+r)/2,sl=0;
for (int i=1;i<=n;){
int s=a[i];
while (s+a[++i]<=mid);
sl++;
}
if (sl>=k) l=mid+1;
else r=mid-1;
}
return r;
}
int main(){
cin>>n>>k;
for (int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
cout<<find();
return 0;
}
为啥只得了20?