暑假-动态规划 III-J - The Peanutsw

题意:给你一个n*m的矩阵【相当于二维坐标系,x的范围是[1,n],y的范围是[1,m]】,每个

位置都有一个数值【除0】,代表花生的数目,现在要求从坐标系的正上方出发,每走一个

单位花费一秒,拿花生也得花一秒,一共K秒时间,并且规定拿花生的数目要从大到小的拿。

问:在K秒内,正上方【road】出发再回到正上方【road】最多能拿多少花生?

思路:按照题意拿花生的数目要从大到小的拿,即可用贪心去求解,一开始有K秒,没到一个

地方拿花生就减去这过程中所消耗的时间,要注意必须要回到【road】所以每次都要判断能否

有足够的时间回去。然则就不再去下一个地点拿花生。


#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 3000;
struct Node
{
	int x;
	int y;
	int val;
};
Node point[MAXN];
bool cmp(Node a, Node b)
{
	return a.val > b.val;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n, m, k, num, ans=0;
		cin >> n >> m >> k;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				cin >> num;
				if (num)//保存拥有花生的坐标位置
				{
					point[ans].x = i;
					point[ans].y = j;
					point[ans].val = num;
					ans++;
				}
			}
		}
		sort(point,point + ans, cmp);//按花生数目从大到小排序
		int temp = 0,maxsum=0;//消耗的时间,所能获得的花生数
		if (point[0].x * 2 + 1<= k)//因为要从大到小的拿,所以第一个拿的花生地点为point[0]
		{
			maxsum = point[0].val;//累加获得的花生数目
			temp = point[0].x + 1;//消耗了从起始点【road】到第一个点的时间+拿花生的时间
			for (int j = 1; j < ans; j++)
			{
				if (temp + abs(point[j].x - point[j - 1].x) + abs(point[j].y - point[j - 1].y) + 1 +point[j].x <= k)
				{ //剩下的时间若果满足从当前点坐标走到下一个点的坐标+拿花生所花费的1秒+回去要花费point[j].x秒
					temp += abs(point[j].x - point[j - 1].x) + abs(point[j].y - point[j - 1].y) + 1 ;//累加消耗时间
					maxsum += point[j].val;//累加获得的花生数目
				}
				else//没有足够的时间去下一个地点拿花生再回到【road】
				{
					break;
				}
			}
		}
		cout << maxsum << endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值