POJ_3273Monthly Expense解题报告。

原创 2012年03月22日 12:43:16

                                                                                                                          Monthly Expense
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 7912   Accepted: 3250

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 ≤ MN) 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

Hint

If Farmer John schedules the months so that the first two days are a month, the third and fourth are a month, and the last three are their own months, he spends at most $500 in any month. Any other method of scheduling gives a larger minimum monthly limit.
算法类型:二分查找。
解题思路:先找出单日消费的最大值,令它为二分查找的的最低端,算出所有钱数,为二分查找的最大值,再进行二份查找,在统计分的个数是否满足题目要求,不满足的话再继续二分。
算法实现:
#include<stdio.h>
#define MAX 100001
int a[MAX];
int N,M;
int search(int mid,int m)   //查找函数;
{
	int sum=1,s=0;
	int i;
	for(i=0;i<N;i++)
	{
		s=s+a[i];
		if(s>mid)
		{
		 sum++;
		 s=a[i];
		 if(sum>M)
		 return 0;
		}
	}
	return 1;
}
int main()
{
	int high=0,low=0,mid;
	scanf("%d %d",&N,&M);
	for(int i=0;i<N;i++)
    {
		scanf("%d",&a[i]);
		high=high+a[i];  //设置上限和下限;
		if(a[i]>low)
		low=a[i];
	}
	while(low<=high)
	{
		mid=(high+low)/2;   //二分查找;
		if(search(mid,M)==0)
		{
			low=mid+1;
		}
		else
		{
			high=mid-1;
		}
	}
	printf("%d",mid);
	return 0;
}



 

相关文章推荐

POJ-3273 Monthly Expense 解题报告

Description Farmer John is an astounding accounting wizard and has realized he might run out of m...

POJ3273-Monthly Expense

  • 2011年07月31日 23:05
  • 6KB
  • 下载

G - Monthly Expense解题报告(黄杰)

G - Monthly Expense Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

POJ_3273_Monthly Expense

poj 3273 Monthly Expense Farmer John is an astounding accounting wizard and has realized he might ru...
  • Mrx_Nh
  • Mrx_Nh
  • 2016年10月01日 03:17
  • 130

POJ 3273 Monthly Expense(二分)

http://poj.org/problem?id=3273 Monthly Expense Time Limit: 2000MS   Memo...

POJ3273:Monthly Expense(二分)

Description Farmer John is an astounding accounting wizard and has realized he might run out of m...

POJ 3273-Monthly Expense(二分法-最小化最高花费)

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24397   Accepted:...
  • MIKASA3
  • MIKASA3
  • 2017年02月09日 14:24
  • 162

POJ 3273 Monthly Expense

题目的大意是:给你两个数n,m。m代表给你m个数字,n代表最多分成n组。求每组连续数字最小的和。 一开始一般大家都会想到是dp但是这是不对的、、要不就不会放在计算方法的分类之中了啊、、disscus...

POJ3273:Monthly Expense

POJ3273:Monthly Expense 题目大意:给定n个数据,将这n个数据分成m组,使得每组数据值和尽可能的小,输出所有组中最大的和。解法很巧妙,开始的时候没想到用二分法解,想暴力枚举过。...

POJ - 3273 Monthly Expense(二分搜索:最小化最大值)

http://poj.org/problem?id=3273 #include #include using namespace std; const int MAX_N = 1e5...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ_3273Monthly Expense解题报告。
举报原因:
原因补充:

(最多只允许输入30个字)