常见问题:
问题一:读题时应该仔细读。有的同学没有看到每次只能拿剩下花生株中最大的,而是希望找到一种在规定时间内能够拿最多花生的组合,把题目变成了另外一道题。
问题二:有的同学没有读到“没有两株花生株的花生数目相同”的条件,因此把题目复杂化了。
问题三:这个题目是假设猴子在取花生的过程中不会回到大路上的,有些同学在思考是否可能在中间回到大路上,因为题目没说在大路上移动要花时间,所以有可能中途出来再进去摘的花生更多。
——摘自洛谷题解。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct point{
int x,y,num;
};
bool cmp1(point A,point B){//按照花生数目降序
return A.num>B.num;
}
point po[410];
int CountP=0;
int Count=0;
int M,N,K;
int ans[21][21];
int r,c;
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
cin>>M>>N>>K;
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++){//输入每个点的花生,并且将数量position存放到结构体
scanf("%d",&ans[i][j]);
po[CountP].x=i;
po[CountP].y=j;
po[CountP++].num=ans[i][j];
}
sort(po,po+CountP,cmp1);//把所有花生按照数量降序
CountP=0;
r=0;c=po[0].y;
while(po[CountP].num!=0){//只要下一个最大的花生点不为0 就一直找
if(K-abs(po[CountP].x-r)-abs(po[CountP].y-c)-1-po[CountP].x<0) break;//判断,到达下一个点无法回到路上,退出整个循环
K=(K-abs(po[CountP].x-r)-abs(po[CountP].y-c)-1);//算出移动到下一个点花的时间
r=po[CountP].x;//更新当前位置
c=po[CountP].y;
Count+=po[CountP].num;//花生计数
CountP++;
}
cout<<Count;
return 0;
}