花生采摘 洛谷P1986题解

前言

刚开始还以为是搜索来着23333
传送门
看似复杂,其实只需要记录下摘每个花生需要的时间,再根据题意从大的花生开始找就行了
要找下一个花生的位置,用曼哈顿距离解决,即两个点的横坐标之差加上纵坐标之差(都要用abs),注意,采摘花生也需要1时间单位
曼哈顿距离公式: ( x 1 − y 1 ) + ( x 2 − y 2 ) (x_1-y_1)+(x_2-y_2) (x1y1)+(x2y2)

#include
#include
#include
#include
using namespace std;
int n,m,shijian,cnt,ans=0,a[25][25];
struct ren{
	int x,y,w,time;//w为该花生的价值,time就是时间
}s[10005];
int cmp(ren x,ren y)
{
	return x.w>y.w;//按照花生的价值排序
}
int main()
{
	scanf("%d%d%d",&n,&m,&shijian);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]>0)//如果该点是花生
			{
				s[++cnt].x=i;
				s[cnt].y=j;
				s[cnt].w=a[i][j];
			}
		}
	}
	sort(s+1,s+1+cnt,cmp);
	for(int i=1;i<=cnt;i++)
	{
		int now=s[i].x;//记录下该点到第一行的距离
		if(i==1)//如果是第一个花生
		{
			s[i].time=s[i].x+1;//它到第一行的距离+采摘需要的一分钟
		}
		else{//否则
			s[i].time=s[i-1].time+abs(s[i].x-s[i-1].x)+abs(s[i].y-s[i-1].y)+1;//上一个花生的时间加上两点的曼哈顿距离,别忘了还要加1
		}	
		if(s[i].time+now<=shijian)//如果能在规定时间内采摘该花生
		{
		ans+=s[i].w;
			}
	}
	printf("%d\n",ans);
	return 0;
}

你可能感兴趣的:(模拟,题解,贪心)