pat乙级 采花生

代码思想

首先声明一个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;
}
发布了18 篇原创文章 · 获赞 0 · 访问量 65

猜你喜欢

转载自blog.csdn.net/qq_38303368/article/details/104875082
今日推荐