题面
solution
这题看起来很复杂,其实很水,注意别看错题目造成不必要的WA
废话不多说,上代码
code
1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 using namespace std; 5 /* 6 你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生; 7 依此类推,不过你一定要在我限定的时间内回到路边。 8 */ 9 struct node 10 { 11 int x,y,value; 12 }; 13 14 int m,n,k,t; 15 16 struct node p[1000]; 17 18 int mov(int now) //计算采花生步行过程中需要的时间花费 19 { 20 int m; 21 m=abs(p[now-1].x-p[now].x)+abs(p[now-1].y-p[now].y); 22 return m; 23 } 24 25 void Sort() //按照花生的数量对有花生的节点进行降序排序 26 { 27 for (int i=1;i<t;i++) 28 for (int j=i+1;j<=t;j++) 29 if (p[i].value<p[j].value) 30 { 31 swap(p[i].x,p[j].x); 32 swap(p[i].y,p[j].y); 33 swap(p[i].value,p[j].value); 34 } 35 } 36 37 int main() 38 { 39 cin>>m>>n>>k; 40 t=0; 41 int i,j; 42 for (i=1;i<=m;i++) //输入数据处理 43 for (j=1;j<=n;j++) 44 { 45 int value; 46 cin>>value; 47 if (value!=0) 48 { 49 p[++t].value=value; 50 p[t].x=j; 51 p[t].y=i; 52 } 53 } 54 Sort(); //节点的花生数量排序 55 int now=1,ans=0; 56 p[0].x=p[1].x; 57 p[0].y=0; 58 p[0].value=0; 59 while ((k>0)&&((k-mov(now))>p[now].y)) //摘花生过程,且判断达到下一位置能否返回 60 { 61 k-=mov(now); //采花生过程中时间消耗计算 62 k--; 63 ans+=p[now].value; //能采到的花生节点,进行累计 64 now++; //继续尝试去踩下一个位置的花生 65 } 66 cout<<ans<<endl; 67 return 0; 68 }