NYOJ 680 摘枇杷

摘枇杷

时间限制: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
二分+贪心!
AC码:
#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;
}

NYOJ 680 摘枇杷

时间: 2024-11-13 04:33:25

NYOJ 680 摘枇杷的相关文章

摘枇杷

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

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

NYOJ 289 苹果

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

陶陶摘苹果(升级版)

题目描述 又是一年秋季时,陶陶家的苹果树结了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),

NYOJ 461-Fibonacci数列(四)(求斐波那契数列前4位)

题目地址:NYOJ 461 思路:斐波那契数列的通项公式为 然后下一步考虑如何产生前4位: 先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432, 那么log10(10234432)=log10(1.0234432*10^7)[用科学记数法表示这个数]=log10(1.0234432)+7; log10(1.0234432)就是log10(10234432)的小数部分. log10(1.0234432)=0.0