1747 - 花生采摘

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB


鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。

鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图<span>1</span>)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”

我们假定多多在每个单位时间内,可以做下列四件事情中的一件:

<span>1) </span>从路边跳到最靠近路边(即第一行)的某棵花生植株;

<span>2) </span>从一棵植株跳到前后左右与之相邻的另一棵植株;

<span>3) </span>采摘一棵植株下的花生;

<span>4) </span>从最靠近路边(即第一行)的某棵花生植株跳回路边。

现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。

例如在图<span>2</span>所示的花生田里,只有位于<span>(2, 5), (3, 7), (4, 2), (5, 4)</span>的植株下长有花生,个数分别为<span>13, 7, 15, 9</span>。沿着图示的路线,多多在<span>21</span>个单位时间内,最多可以采到<span>37</span>个花生。

<br />

题目输入


输入文件<span>peanuts.in</span>的第一行包括三个整数,<span>M, N</span>和<span>K</span>,用空格隔开;表示花生田的大小为<span>M * N</span>(<span>1 &lt;= M, N &lt;= 20</span>),多多采花生的限定时间为<span>K</span>(<span>0 &lt;= K &lt;= 1000</span>)个单位时间。接下来的<span>M</span>行,每行包括<span>N</span>个非负整数,也用空格隔开;第<span>i + 1</span>行的第<span>j</span>个整数<span>Pij</span>(<span>0 &lt;= Pij &lt;= 500</span>)表示花生田里植株<span>(i, j)</span>下花生的数目,<span>0</span>表示该植株下没有花生。

<br />

题目输出


输出文件<span>peanuts.out</span>包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。

<br />

输入/输出样例

输入格式

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

输出格式

37

C++解答

#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int hst[21][21];
int max_x,max_y;
int c_x,c_y;
int time=0;
int cdd=0;
int main()
{
	int m,n,k;
	scanf("%d%d%d",&m,&n,&k);
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&hst[i][j]);
		}
	}
	for(int c=1;c<=1000;c++)
	{
		//find
		int max=0;
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(hst[i][j]>max)
				{
					max=hst[i][j];
					max_x=i;
					max_y=j;
					//hst[i][j]=0;
				}
			}
		}
		//l
		if(c==1)
		{
			c_x=0;
			c_y=max_y;
		}
		if(time+abs(max_x-c_x)+abs(max_y-c_y)+max_x>=k)
		{
			break;
		}
		else
		{
			time+=abs(max_x-c_x)+abs(max_y-c_y);
			cdd+=hst[max_x][max_y];
			hst[max_x][max_y]=0;
			c_x=max_x;
			c_y=max_y;
			time++;
		}
	}
	printf("%d",cdd);
	//system("pause");
	return 0;
}