#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
int nut[2501][3];
void q_sort( int l, int r)
{
if( l>= r) return;
int i,j,x0,x1,x2;
i = l;
j = r;
x0 = nut[l][0];
x1 = nut[l][1];
x2 = nut[l][2];
while( i<j )
{
while( i<j && nut[j][2]<x2 )j--;
if( i<j )
{
nut[i][0] = nut[j][0];
nut[i][1] = nut[j][1];
nut[i++][2] = nut[j][2];
}
while( i<j && nut[i][2]>x2 )i++;
if( i<j )
{
nut[j][0] = nut[i][0];
nut[j][1] = nut[i][1];
nut[j--][2] = nut[i][2];
}
}
nut[i][0] = x0;
nut[i][1] = x1;
nut[i][2] = x2;
q_sort( l , i-1 );
q_sort( i+1 , r );
}
int main()
{
int t, m, n, k, time, count;
int i, j, p;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&m,&n,&k);
p = 0;
memset(nut,0,sizeof(int)*2501*3);
for( i = 1 ; i<=m ; i++ )
for( j = 1 ; j<=n ; j++ )
{
nut[p][0] = i;
nut[p][1] = j;
scanf("%d",&nut[p][2]);
p++;
}
q_sort( 0 , p-1 );
time = nut[0][0] + 1 + nut[0][0];//往+摘+返
p = 0 ;
count = 0;
while( time <= k )
{
count += nut[p][2];
time = time - nut[p][0];
p++;
time = time + abs(nut[p][0]-nut[p-1][0]) + abs(nut[p][1]-nut[p-1][1]) + 1 + nut[p][0];
}
printf("%d\n",count);
}
return 1;
}
这道题有两种思路:
一种是采用模拟的方法,用m*n二维矩阵存储花生的数量,每次摘完最大的花生后,遍历矩阵,找到其次大的花生,耗时
我采用的方法是将行、列、花生数量存在2500*3矩阵中,对其从大到小快速排序,以此判断时候可以去摘。
当然,可以采用别的排序方法,比如选择排序。