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;
}



 

NOIP2007 T1奖学金 解题报告-S.B.S.

洛谷P1093 题目描述   某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总...
  • SBS2000
  • SBS2000
  • 2016年05月02日 16:42
  • 172

noi2016解题报告

D1T1: 首先转化成统计AA型字符串有几种。 st[i]表示从i位置开始的AA型字符串有几个,ed[i]表示到i结束的有几个。 ans=∑st[i]*ed[i-1] 然后枚举A的长度L(AA...
  • wzf_2000
  • wzf_2000
  • 2017年05月21日 19:38
  • 467

POJ1001解题报告

乍一看就是大数乘法问题,要通过可不是那么容易
  • zhangxiao93
  • zhangxiao93
  • 2014年07月31日 15:07
  • 853

NOIP2014提高组复赛解题报告

Day1 T1生活大爆炸版剪刀石头布:模拟,水; T2联合权值:树形DP,水; T3Flappy Birds: 这道题我当时算时间复杂度算错了,O(nm^2)的时间复杂度给算成O(nm)了,所...
  • TA201314
  • TA201314
  • 2014年11月18日 21:15
  • 6836

并查集解题报告

第一题:                      这题我讲过的,代码直接就给出来的,就是连上去再找父亲两个操作而已,对吧?可能容易错的地方就是忘记初始化了,话不多说,这题我直接给代码 #includ...
  • caojiangxia
  • caojiangxia
  • 2015年04月01日 21:07
  • 267

POJ 1789 解题报告

这道题是求最小生成树。很久之前是用kruskal算法求的(之前已经用过这个模板很多次),但是超时了,这里是稠密图,对所有边排序是非常耗时的操作。这里改用没有优化的prim算法(用的是数组而不是heap...
  • thestoryofsnow
  • thestoryofsnow
  • 2015年08月19日 01:39
  • 275

poj1001 解题报告

Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 n),其中n 是...
  • kylerance
  • kylerance
  • 2016年08月09日 18:14
  • 276

POJ 2253 解题报告

看了discuss,这道题似乎用很多方法都能accept:多源最短路径(Floyd),单源最短路径(Dijkstra, SPFA),或最小生成树(prime)。 我这里用的是spfa,稍稍改变下条件...
  • thestoryofsnow
  • thestoryofsnow
  • 2015年05月12日 07:54
  • 204

noi2017解题报告(部分)

D1T1: 每30位压成一个int,然后压位线段树就可以过了。#include #define gc getchar() #define N 4500009 #define mid (l+r>>1...
  • wzf_2000
  • wzf_2000
  • 2017年08月07日 09:28
  • 842

POJ3009 解题报告

Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21649 Accepted: 8814 ...
  • liu_jiangwen
  • liu_jiangwen
  • 2017年07月18日 18:55
  • 134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ_3273Monthly Expense解题报告。
举报原因:
原因补充:

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