[关闭]
@Metralix 2017-03-31T15:58:02.000000Z 字数 666 阅读 745

B - C - Monthly Expense

二分


题目大意

给你n个数把他们连续的分成m组,问最小的那一组的最大值

解题思路

最大的那部分总和num存在一个范围,num总大于等于数组中最大的那个数,总小于等于整个数组的和。得到了一个范围a~b,用二分法不断缩小范围,比如第一次取mid = a + (a - b) / 2, 那么分组时候每组最大为mid,分到最后一个得到的组数如果小于等于m那就将范围缩小到a~mid,如果分得的组数大于m,那就将范围缩小到mid~b,直到不能缩小了就能得到最优值了
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,m;
  5. int a[100010];
  6. int fun(int a[],int mid)
  7. {
  8. int sum=0,t=1;
  9. for(int i=1;i<=n;i++)
  10. {
  11. if(sum+a[i]<=mid)
  12. sum+=a[i];
  13. else
  14. {
  15. sum=a[i];
  16. t++;
  17. }
  18. }
  19. if(t>m)
  20. return 0;
  21. return 1;
  22. }
  23. int main()
  24. {
  25. while(scanf("%d %d",&n,&m)!=EOF)
  26. {
  27. int l,r=0;
  28. int mid,sum=0;
  29. for(int i=1;i<=n;i++)
  30. {
  31. scanf("%d",&a[i]);
  32. sum+=a[i];
  33. if(a[i]>r)r=a[i];
  34. }
  35. l=sum;
  36. mid=(l+r)/2;
  37. while(r<l)
  38. {
  39. if(!fun(a,mid)) r=mid+1;
  40. else l=mid-1;
  41. mid=(r+l)/2;
  42. }
  43. printf("%d",mid);
  44. }
  45. return 0;
  46. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注