Monthly Expense poj 3273
转载请注明出处,谢谢。http://www.cnblogs.com/acmer-roney/---by Roney
题意:给你N天,每天都有一定的花费,要求你分成M组,使这M组中每组和的最大值最小。
解题思路:二分。关键是求二分的范围。由于二分的效率很高,我们可以在最大的可能范围内搜索,而不必对于每一组测试数据都去计算该组数据的确切范围。
所以对于每一组的数据最大可能范围就是每天花费的最大值—>所有天数花费和。
此题和poj 2456 Aggressive cows相似。
AC代码:
View Code
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 int a[N]; 7 int n,m; 8 bool ok(int x){ 9 int num=0,tot=0; 10 for(int i=1;i<=n;i++){ 11 tot+=a[i]; 12 if(tot>x){ 13 num++; 14 tot=a[i]; 15 if(num>m)return false; 16 } 17 else if(tot==x){ 18 num++; 19 tot=0; 20 if(num>m)return false; 21 } 22 } 23 if(tot>0&&tot<x)num++; 24 if(num<=m)return true; 25 return false; 26 } 27 int main() 28 { 29 int i,min=0,max=0,ans,mid; 30 while(scanf("%d %d",&n,&m)!=EOF){ 31 for(i=1;i<=n;i++){ 32 scanf("%d",&a[i]); 33 if(a[i]>min)min=a[i]; 34 max+=a[i]; 35 } 36 while(min<=max){ 37 mid=(min+max)/2; 38 if(ok(mid)){ 39 ans=mid; 40 max=mid-1; 41 } 42 else min=mid+1; 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 }
posted on 2012-09-05 21:55 Acmer_Roney 阅读(156) 评论(0) 收藏 举报

浙公网安备 33010602011771号