旅游(travel)

206 篇文章 0 订阅
119 篇文章 0 订阅

Description
ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。

ztxz16生活的城市有N*M个景点,可以描述成一个N * M的矩形,每个景点有一个坐标(x, y) (1 <= x <= N, 1 <= y <= M)以及美观度A[x][y]和观赏所需的时间B[x][y],从一个景点(x1, y1)走到另一个景点(x2, y2)需要时间为它们之间的曼哈顿距离:|x1 - x2| +|y1 - y2|。

为了防止审美疲劳,ztxz16希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码,ztxz16希望旅游的总时间尽可能长。

Input
第一行输入两个整数N, M;

接下来N行每行M个整数,第x行第y个整数代表A[x][y];

接下来N行每行M个整数,第x行第y个整数代表B[x][y];

注意,有一些A[x][y]=B[x][y]=0,说明这个景点已经拆除,不能游览;

Output
输出一行代表最长的总时间。

Sample Input
4 5

1 2 6 0 2

1 3 4 0 4

0 0 4 0 3

2 2 0 0 4

1 3 5 0 2

2 8 1 0 2

0 0 3 0 4

0 5 0 0 3

Sample Output
39

【样例说明】

游览顺序为(2,1)->(1,5)->(2,2)->(4,5)->(1,3)

Data Constraint
对于30%的数据:1<=N<=50 , 1<=M<=50
对于60%的数据:1<=N<=300 , 1<=M<=300
对于100%的数据:1<=N<=1000 , 1<=M<=1000
0<=A[x][y]<=1000000
0<=B[x][y]<=10^9
注意:本题输入数据较大,请注意输入消耗的时间

.
.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int n,m,b[1010][1010],cnt=0;
long long f[1000010],ans=-2147483647;

struct edge
{
	int x,y,z;
}a[1000010];

bool cmp(edge x,edge y)
{
	return x.z<y.z;
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			scanf("%d",&b[i][j]);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++) 
		{
			int x;
			scanf("%d",&x);
			if (x==0&&b[i][j]==0) continue;
			cnt++;
			a[cnt].z=b[i][j];
			a[cnt].x=i;
			a[cnt].y=j;
			b[i][j]=x;
		}
	sort(a+1,a+cnt+1,cmp);
	int x=1,y=0,x1=1;
	f[1]=b[a[1].x][a[1].y];		
	for (int i=2;i<=cnt;i++)
	{
		if (a[i].z!=a[i-1].z)
		{
			x=x1;
			y=i-1;
			x1=i;
		}
		for (int j=x;j<=y;j++)
			f[i]=max(f[i],f[j]+abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y));
		f[i]+=b[a[i].x][a[i].y];
		ans=max(ans,f[i]);
	}
	printf("%lld",ans);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值