#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矩阵中,对其从大到小快速排序,以此判断时候可以去摘。
当然,可以采用别的排序方法,比如选择排序。