分成2个小组时,第1小组由前4个人组成,第2小组由第5个人单独组成,此时最弱小组的体力和为9(其它划分方案时最弱小组的体力和都小于9)。
友情提示:题目没有范围,最好开大点,开始开了1万,WA了仨
二分一个ans, check的时候每当有一部分的人的体力值得和>ans,就把和清空记为一组,直到有k组,比较最后一组与ans的大小
1 #include <algorithm>
2 #include <cstdio>
3
4 using namespace std;
5
6 const int N(2333333);
7 int n,k,val[N];
8
9 int ans,l,r,mid;
10 bool check(int x)
11 {
12 int temp=0,sum=0;
13 for(int i=1;i<=n;i++)
14 {
15 sum+=val[i];
16 if(sum>x) sum=0,temp++;
17 if(sum<x&&temp>=k) return false;
18 }
19 return true;
20 }
21
22 int main()
23 {
24 scanf("%d%d",&n,&k);
25 for(int i=1;i<=n;i++)
26 scanf("%d",val+i),r+=val[i];
27 for(;l<=r;)
28 {
29 mid=l+r>>1;
30 if(check(mid))
31 {
32 ans=mid;
33 r=mid-1;
34 }
35 else l=mid+1;
36 }
37 printf("%d\n",ans);
38 return 0;
39 }