https://www.luogu.org/problemnew/show/P1086

题解:

按权值大小排列然后一步步走就行了

常见问题:

问题一:读题时应该仔细读。有的同学没有看到每次只能拿剩下花生株中最大的,而是希望找到一种在规定时间内能够拿最多花生的组合,把题目变成了另外一道题。

问题二:有的同学没有读到“没有两株花生株的花生数目相同”的条件,因此把题目复杂化了。

问题三:这个题目是假设猴子在取花生的过程中不会回到大路上的,有些同学在思考是否可能在中间回到大路上,因为题目没说在大路上移动要花时间,所以有可能中途出来再进去摘的花生更多。

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
typedef __int128 lll;
const int N=500;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
struct node{
    int x,y;
    int v;
    node(){};
    node(int x1,int y1,int v1){
        x=x1;
        y=y1;
        v=v1;
    }
    bool operator <(const node &S)const{
        return v>S.v;
    }
}e[N];
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    scanf("%d%d%d",&n,&m,&k);
    int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&q);
            e[++cnt]=node(j,i,q);
        }
    }
    if(cnt==1){
        int ans;
        if(k<2)ans=0;
        else ans=e[1].v;
        cout << ans << endl;
        return 0;
    }
    sort(e+1,e+cnt+1);
    int sum=0;
    int x=e[1].x;
    int y=0;
    int time=0;
    int c=1;
    int temp=abs(x-e[c].x)+abs(y-e[c].y);
    while(time+temp+1+e[c].y<=k){
        sum+=e[c].v;
        x=e[c].x;
        y=e[c].y;
        time+=temp+1;
        c++;
        if(c==cnt+1)
            break;

        temp=abs(x-e[c].x)+abs(y-e[c].y);
    }
    cout << sum << endl;
    //cout << "Hello world!" << endl;
    return 0;
}