摘枇杷

摘枇杷

时间限制:2000 ms  |  内存限制:65535 KB

难度:3

描述

理工学院的枇杷快熟了,ok,大家都懂得。而且大家都知道,学校的枇杷树都是一列一列的。现在小Y同学已经在筹划怎么摘枇杷了。现在我们假设有一列枇杷树,而且每棵枇杷树上枇杷果的数量小Y都已经知道了。

假设现在有n棵枇杷树,小Y可以把这n棵枇杷树分成m组,每组枇杷果的数量是这组内每棵枇杷树上枇杷果数量的和。注意,每组的枇杷树必须是连续的。(每组最少1棵树,最多n棵树)。小Y把枇杷往寝室拿的时候是一组一组拿的,所花费的力气等于这m组中枇杷果最多的那组枇杷果的数量。现在小Y想花尽量少的力气把这些枇杷果拿回寝室。

输入
多组测试数据,以EOF结束(<= 100组)

每组测试数据第一行有两个数n(n <= 1000)和m(1 <=m <= n)

第二行有n个数,分别代表每颗树上枇杷果的数量

输出
输出小Y同学所花费的最小的力气,每个结果占一行。
样例输入
3 2
1 2 3
7 5
1 4 3 1 5 2 4
样例输出
3
5
来源

NYIST第一届校赛(专业组)

代码:

#include<stdio.h>
int m,sum,max,n;
int a[1005];
int judge(int x)
{// 该函数功能是判断能否把给定序列划分为每个序列之和不大于x的m个子序列
	int count=0,s=0,i;   // count表示划分线的条数
	// 每次都是从左往右划分,划分线的条数不大于m-1条
	for(i=0;i<n;i++)
	{
		if(a[i]>x)   // 如果有一个元素大于x,则即使在这个数的左边和右边都设有划分线,也不能使划分后的任一序列都不大于x
			return 0;
		if(s+a[i]>x) // 当s+a[i]>x,就不能再将a[i]加上了
		{
			count++; // 需要再多用一条划分
			s=a[i];
			if(count>m-1) // count=m时,表示已经用了m条划分线,将原序列分成了m+1个子序列
				return 0;
		}
		else
			s+=a[i];    // 贪心策略,每使用一条划分线,都分隔尽量多的元素
	}
	return 1;
}
int fun()
{
	int L=max,R=sum,mid;
	while(L<=R)
	{
		mid=(L+R)/2;
		if(judge(mid))
			R=mid-1;
		else
			L=mid+1;
	}
	return L;
}
int main()
{
	int i;
	while(~scanf("%d%d",&n,&m))
	{
		sum=0;
		max=0;
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			sum+=a[i];
			if(max<a[i])
				max=a[i];
		}
		printf("%d\n",fun());
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 20:35:06

摘枇杷的相关文章

NYOJ 680 摘枇杷

摘枇杷 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 理工学院的枇杷快熟了,ok,大家都懂得.而且大家都知道,学校的枇杷树都是一列一列的.现在小Y同学已经在筹划怎么摘枇杷了.现在我们假设有一列枇杷树,而且每棵枇杷树上枇杷果的数量小Y都已经知道了. 假设现在有n棵枇杷树,小Y可以把这n棵枇杷树分成m组,每组枇杷果的数量是这组内每棵枇杷树上枇杷果数量的和.注意,每组的枇杷树必须是连续的.(每组最少1棵树,最多n棵树).小Y把枇杷往寝室拿的时候是一组一组拿的,所花费的力

陶陶摘苹果(升级版)

题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了.当然,每次摘苹果时都要用一定的力气.陶陶想知道在s<0之前最多能摘到多少个苹果. 现在已知n个苹果到达地上的高度xi,椅子的高度a,陶陶手伸直的最大长度b,陶陶所剩的力气s,陶陶摘一个苹果需要的力气yi,求陶陶最多能摘到多少个苹果. 输入输出格式 输入格式: 第1行:两个数 苹果数n,

树形数组——摘星星伪题解

树形数组. 题目:摘星星 描述:宇航员经常检测星图,在星图上,星星由点表示而且每颗星星都有笛卡尔坐标.星星的等级表示左下方星星的数量.宇航员想知道星星等级的分布. 例如,如上面图形所示,第5号星等级是3 (它由三个标记为1,2和4的星组成).标记着2和4的星星的等级是1,在此地图上,0等级的星星只有一个,1等级的有两个,2等级的有一个,3等级的有一个. 你设计一个程序,在给定地图上计算出每个等级星星的数量. 输入: 输入文件“INPUT.TXT”的第一行包含N个星星(1<=N<=60000),

socket 网摘

一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打 开文件的函数:socket(),调用socket(),该函数返回一个整型的socket的描述符,随后的连接建立.数据传输等操作也都是通过该socket实现. 1.socket函数 syntax:    int socket(int domain, int type, int protocol); 功能

递归,回溯,DFS,BFS的理解和模板【摘】

递归:就是出现这种情况的代码: (或者说是用到了栈) 解答树角度:在dfs遍历一棵解答树 优点:结构简洁缺点:效率低,可能栈溢出 递归的一般结构: 1 void f() { 2 if(符合边界条件) { 3 /////// 4 return; 5 } 6 7 //某种形式的调用 8 f(); 9 } 回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的.回溯法可以被认为是一个有过剪枝的DFS过程.解答树角度:带回溯的dfs遍历一棵解答树回溯的一般结构: 1 void dfs(int

uva 230 Borrowers(摘)&lt;vector&gt;&quot;结构体“ 膜拜!

I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves, and creators of odd volumes. --Charles Lamb, Essays of Elia (1823) 'The Two Races of Men' Like Mr. Lamb, librarians have their problems with borrowe

C#里partial关键字的作用(转摘)

C#里partial关键字的作用(转摘) 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文件中实现.(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起.(3) 需要多人合作编写一个类. 局部类型是一个纯语言层的编译处理,不影响任何执行机制——事实上C#编译器在编译的时候仍会将各个部分的局部类型合并成一个

争议的编程观点(网摘)

1.   业余时间不会为了好玩而编程的程序员,永远比不上那些以编程为乐的同学. 我认为即使是最聪明.最有才华的人,如果只是将编程作为工作,也永远成不了真正优秀的程序员.以编程为乐的人会在业余时也搞些小项目,或者弄弄各种不同的编程语言和编程思想. 2.   单元测试无助于编写优秀代码. 编写单元测试的唯一理由仅仅是确保已经能工作的代码不会出问题.先写测试或者按测试来写代码是无比荒谬的.如果在代码之前写测试,你都不知道边 界情况是什么.虽然能让代码通过测试,但是在没有预见到的情况时还是会出问题.而且

NOIP2005-普及组复赛-第一题-陶陶摘苹果

题目描述 Description 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目.假设她碰到苹果,苹果就会掉下来. 输入输出格式 Input/output 输入格式:输入文件apple.in包括两行数据.第一行包含10个100到200之间(包括100和200