码迷,mamicode.com
首页 > 其他好文 > 详细

poj3273--Monthly Expense

时间:2015-02-09 09:26:46      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

题意:看着样例说吧 先给你n,m。接着是n行数据,然后要求你把这n行数据分成m份(同一份数据必须是挨着的),使的各份的和尽量小,输出值最大的那一份。

分析:单纯模拟会超时 我用的二分,左边界假设m==n,则ans为所输入数据中最大的那一个。右边界假设m==1,则ans为所输入数据的和。然后不断二分直到两边界重合。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <ctime>
#include <stdlib.h>
#include <string.h>
#define N 100010
#define INF 10000000
#define eps 10E-9
#define mem(a)  memset(a,0,sizeof(a))
#define PI 3.14159265359
using namespace std;
int c[N];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        int sum=0,maxx=-1;
        for(int i=0;i<n;i++)
        {
            cin>>c[i];
            if(c[i]>maxx)
               maxx=c[i];
            sum+=c[i];
        }
        int right=sum;
        int left=maxx;
        int mid;
        while(left<=right)
        {
            int cnt=1;//计算分的份数
            sum=0;
            mid=(left+right)/2;
            for(int i=0;i<n;i++)
            {
                if(sum+c[i]<mid)
                    sum+=c[i];
                else
                {
                    sum=c[i];
                    cnt++;
                }
            }
            if(cnt>m)
                left=mid+1;
            else
                right=mid-1;
        }
        cout<<mid<<endl;
    }
    return 0;
}

poj3273--Monthly Expense

标签:

原文地址:http://blog.csdn.net/bigsungod/article/details/43666953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!