题意:题意: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; }