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;
}