poj 1928

题意:题意:dodo要在规定时间内拿peanut,每次拿peanut都是从最多的那堆拿起,因此需要将peanut的数量从大到小排序,
走路的规则:
1.从road走到field需要一个单位时间
2.在方格内走每一个格的时间是一个单位时间
3.每捡起一堆peanut要用一个单位时间
4.从field走到road需要一个单位时间

思路:题目中提到"根据鲁兵逊先生的要求,多多首先走到花生最多的植株,采摘这颗植株的花生后,走到下一个花生数最多的植株处,如此等等",所以,只需把花生数按从大到小的顺序进行排序,在满足时间限制的前提下依次采摘花生即可,因此可以定义一个结构体,表示网格中的节点,它包含3个成员,节点的x,y坐标,及花生数.在排序时,对节点数组按花生数进行一级排序,即按花生数从大到小排序.

代码如下:

#include <iostream>
#include <algorithm>
using namespace std;

struct  point 
{
	int x1,y1;
	int value;
}p[2510];
int cmp(const void *a,const void *b)
{
	struct point *e1=(point *)a;
	struct point *e2=(point *)b;
	return (e2->value)-(e1->value);
}

int main()
{
	int cases;
	int i,j,m,n,k,t,total,x,y,c;
	cin>>cases;
	while (cases--)
	{
		cin>>m>>n>>k;
		c=1;
		for(i=1;i<=m;i++)
			for(j=1;j<=n;j++)
			{
				cin>>p[c].value;
				p[c].x1=i;
				p[c].y1=j;
				c++;
			}
			qsort(&p[1],m*n,sizeof(p[1]),cmp);
			t=0;
			x=0;
			i=1;
			total=0;
			while (t<k)
			{
				if(p[i].value==0)
					break;
				if(x==0)
					y=p[i].y1;
				if(t+p[i].x1+1+abs(p[i].x1-x)+abs(p[i].y1-y)<=k)
				{
					t+=1+abs(p[i].x1-x)+abs(p[i].y1-y);
					x=p[i].x1;
					y=p[i].y1;
					total+=p[i].value;
				}
				else
					break;
				i++;

			}
			cout<<total<<endl;
	}
	return 0;

}

 

 

你可能感兴趣的:(poj)