您的位置:首页 > 其它

poj3273——Monthly Expense(二分)

2017-02-12 15:50 369 查看
Description

Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and recorded the exact amount of money (1 ≤ moneyi ≤ 10,000) that he will need to spend each day over the next N (1 ≤ N ≤ 100,000) days.

FJ wants to create a budget for a sequential set of exactly M (1 ≤ M ≤ N) fiscal periods called “fajomonths”. Each of these fajomonths contains a set of 1 or more consecutive days. Every day is contained in exactly one fajomonth.

FJ’s goal is to arrange the fajomonths so as to minimize the expenses of the fajomonth with the highest spending and thus determine his monthly spending limit.

Input

Line 1: Two space-separated integers: N and M

Lines 2..N+1: Line i+1 contains the number of dollars Farmer John spends on the ith day

Output

Line 1: The smallest possible monthly limit Farmer John can afford to live with.

Sample Input

7 5

100

400

300

100

500

101

400

Sample Output

500

题意有点难懂,题解上是有n个花费,现在要分成m段。使得每一段的和最小的那个值是所有分法里最大的。

那就通过二分来找最适合的最小值,最小值太大了,分的段数少了或者也是m段,但肯定不是最小的那个

#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <set>
#include <map>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAXN 1000005
#define Mod 10001
using namespace std;
int num[MAXN];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int high=0,low=-INF,mid,ans;
for(int i=0; i<n; ++i)
{
scanf("%d",&num[i]);
low=max(low,num[i]);
high+=num[i];
}
while(low<=high)
{
int sum=0,cnt=1;
mid=(low+high)>>1;
for(int i=0; i<n; ++i)
{
sum+=num[i];
if(sum>mid)
{
sum=num[i];
cnt++;
}
}
if(cnt<=m)
{
ans=mid;
high=mid-1;
}
else
low=mid+1;
}
printf("%d\n",ans);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: