水贪心模拟
按照从大到小按顺序取就可以了
#include "iostream"
#include "algorithm"
using namespace std;
struct comp
{
int a,x,y;
} num[20010];
bool cmp(const comp a,const comp b)
{
return a.a>b.a;
}
int a[51][51];
int main()
{
int t,Case,n,m,i,j,sum,k,x,y,ans;
scanf("%d",&Case);
while (Case--)
{
scanf("%d%d%d",&n,&m,&t);
sum=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]!=0)
{
num[sum].a=a[i][j];
num[sum].x=i;
num[sum++].y=j;
}
}
sort(num,num+sum,cmp);
x=0; y=num[0].y; ans=0;
k=0;
while (t!=0 || k==sum)
{
if (t < abs(x-num[k].x) + abs(y-num[k].y) + 1 + num[k].x ) break;
t-=abs(x-num[k].x)+abs(y-num[k].y)+1;
x=num[k].x; y=num[k].y;
ans+=num[k].a;
k++;
}
printf("%d\n",ans);
}
return 0;
}