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)    收藏  举报

导航