题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680
很巧妙的一个题目,就是看你的逆向思维,result 一定是max(a[i])~sum中的一个数,然后遍历他,网上说可以二分,感觉完全没有必要,暴力也可,我都写了一下。
#include <stdio.h> int a[1010]; int n,m; bool judge(int x) ///最多搬x,看是否能在m组以内搬完 { int s=0,cnt=1; for(int i=0;i<n;i++) { if(s+a[i]>x) { cnt++; s = a[i]; if(cnt>m) return false ; } else s += a[i]; } return true; } int Bin_Search(int _max,int sum) { int l=_max,r=sum; while(l<=r) { int mid = (l+r)/2; if(judge(mid)) r = mid-1; else l=mid + 1; } return l; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); int _max = -1,sum = 0; for(int i=0;i<n;i++) { if(a[i]>_max) _max = a[i]; sum+=a[i]; } /*int i; for(i=_max;i<=sum;i++) { if(judge(i)) break; }*/ printf("%d ",Bin_Search(_max,sum)); } return 0; }