当前位置:编程学习 > C/C++ >>

POJ 3272 Monthly Expense 二分

题意:给你n个数,让分成m组,每组必须是连续的一些数,求每组的和的最大值最小。
思路:二分枚举答案。上界是n个数的和,也就是分成1组的情况,下界是n个数里面的最大值,也就是分成m组的情况,然后看mid = (rp + lp) / 2 能够把n个数分成多少组。其是就是二分枚举求下限的过程。
代码:
[cpp] 
#include <iostream> 
#include <cstdio> 
#include <string.h> 
using namespace std; 
 
typedef long long LL; 
const int N = 100010; 
int num[N]; 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
int main(){ 
    int n,m; 
    while(scanf("%d%d",&n,&m) != EOF){ 
        LL value = 0; 
        int mmax = 0; 
       for(int i = 0; i < n; ++i){ 
           scanf("%d",&num[i]); 
           if(mmax < num[i]) 
               mmax = num[i]; 
           value += num[i]; 
       } 
       LL lp = mmax, rp = value,ans = 0; 
       while(lp < rp){ 
          int cnt = 0; 
          LL mmid = (lp + rp) / 2; 
          LL sum = 0; 
          for(int i = 0; i < n; ++i){ 
              sum += num[i]; 
              if(sum > mmid){ 
                cnt++; 
                sum = num[i]; 
              } 
          } 
          if(cnt < m){ 
            rp = mmid; 
          } 
          else 
              lp = mmid + 1; 
       } 
       printf("%lld\n",lp); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,