代码思想
首先声明一个peanut结构体,在其中放入坐标、花生数量,并定义构造函数,重载小于运算符,数量越多越靠前。
在main函数中,定义一个vector向量,用于存储数量不为0的花生对象,之后输入矩阵,并对已存入数据的vector进行排序,之后遍历vector,计算当前位置到该花生植株的时间以及采摘时间、回到主人身边的时间,判断其是否小于等于剩余时间,若时间充足,则采摘,否则直接放弃,就算还剩一些时间可以采摘其他植株。这也是不太合理的地方,刚开始是时间不够则跳过这棵植株即continue,后来发现无法通过,是直接放弃,故改成break之后就通过了。
代码(C++)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int mat[21][21];
struct peanut{
int x;
int y;
int amount;
peanut(int a, int b, int m) :x(a), y(b), amount(m){}
bool operator<(const peanut& p){
return amount > p.amount;
}
};
int abs(int x){//绝对值
return x > 0 ? x : -x;
}
int main(){
int m, n, k;
vector<peanut>v;
while (scanf("%d%d%d", &m, &n, &k) != EOF){
v.clear();
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
scanf("%d", &mat[i][j]);
if (mat[i][j] != 0){
peanut p(i, j, mat[i][j]);
v.push_back(p);
}
}
}
sort(v.begin(), v.end());
int tmp_x = -1, tmp_y = -1;
int res = 0;
for (int i = 0; i < v.size(); i++){
if (k == 0)
break;
int time = 0;
if (tmp_x == -1){
time = v[i].x + 1;
}
else{
time += abs(tmp_x - v[i].x);
time += abs(tmp_y - v[i].y);
}
time += 1;
time += v[i].x + 1;
if (time <= k){
res += v[i].amount;
time -= v[i].x + 1;
k -= time;
tmp_x = v[i].x;//记录新的位置
tmp_y = v[i].y;
}
else
break;
}
cout << res << endl;
}
return 0;
}