【输入输出样例解释1】
每个袋子的体积为3即可。前2棵果树的果子装在第一个袋子里,第3棵果树的果子装在第二个袋子里。第三个袋子不用装了。
【输入输出样例解释2】
每个袋子的体积为7即可。前2棵果树的果子装在第一个袋子里,此时第一个袋子已经装了4单位体积的果子,第3棵果树的果子装不下了,所以装进第二个袋子里,第4棵果树的果子刚好装进第二个袋子,第5棵果树的果子装进第三个袋子里。
【输入输出样例解释3】
每个袋子的体积为4即可。前3棵果树的果子装在第一个袋子里,第4~5棵果树的果子装在第二个袋子里,第6棵果树的果子装在第三个袋子里。
【数据范围】
对于40%的数据,0<m≤n≤1,000,0<ai≤1,000;
对于70%的数据,0<m≤n≤100,000,0<ai≤100,000;
对于100%的数据,0<m≤n≤100,000,0<ai≤1,000,000,000。
1 #include<cstdio>
2
3 #define N 100000+100
4
5 using namespace std;
6
7 long long n,m;
8 long long a[N],sum;
9
10 bool found(long long k)
11 {
12 int ans=0;
13 long long pp=0;
14 for(int i=1;i<=n;i++)
15 {
16 if(pp+a[i]>k)
17 {
18 ans++;
19 pp=a[i];
20 }
21 else
22 pp+=a[i];
23 }
24 if(pp!=0) ans++;
25 if(ans>m) return 0;
26 else return 1;
27 }
28
29 int main()
30 {
31 //scanf("%I64d%I64d",&n,&m);
32 scanf("%lld%lld",&n,&m);
33 for(int i=1;i<=n;i++)
34 scanf("%lld",&a[i]),sum+=a[i];
35 //scanf("%I64d",&a[i]),sum+=a[i];
36 long long l=0,r=sum;
37 while(l<=r)
38 {
39 long long mid=(l+r)/2;
40 if(found(mid)==true) r=mid-1;
41 else l=mid+1;
42 }
43 //printf("%I64d",l);
44 printf("%lld",l);
45 return 0;
46 }