欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【JZOJ A组】拯救奶牛

程序员文章站 2024-02-11 13:15:40
...

Description

贝希被困在一个三角形的迷宫之中。这个迷宫有N行(1 <= N <= 1000000)。比如下图是一个3行的迷宫。
  【JZOJ A组】拯救奶牛
  
  迷宫的第i行有2*i-1个三角形,从左到右分别编号为(i,1)、(i,2)等等。贝希每次可以从一个三角形走到任意一个一个跟当前的三角形有邻边的三角形。比如说,如果她目前处于三角形(3,3),那么,她可以走到三角形(3,2)、(3,4)和(4,4)。贝希每次需要一分钟的时间来移动到下一个三角形。
  【JZOJ A组】拯救奶牛
  农夫约翰发现贝希被困了!于是她跟踪贝希的iPhone手机(可怜的触摸屏~),得知贝希目前处于三角形(Si,Sj)。因为约翰对贝希有着无穷无尽的浓浓爱意,所以他希望贝希能尽可能快地回到他的身边。
  在迷宫的三角形之中,有M(1 <= M <= 10000)个是出口。在任何一个出口都可以让贝希逃离迷宫。一旦贝希进入一个作为出口的三角形,她用多一分钟就可以逃离这个迷宫。
  找到一个可以让贝希逃离迷宫最小时间T,并输出她应该从哪一个出口逃离迷宫,这个出口记为(OUTi,OUTj)。如果有多个出口同时需要时间T,输出那个行的编号小的出口,如果仍然有多个出口,输出那个列的编号小的。

Input

第一行:两个由空格隔开的整数:N和M。
  第二行:两个由空格隔开的整数:Si和Sj。
  第三到第M+2行:第i+2行有两个由空格隔开的整数Ei和Ej,表示三角形(Ei,Ej)是出口。

Output

第一行:两个由空格隔开的整数:OUTi和OUTj。
  第二行:一个单独的整数:T。

Sample Input

4 2
2 1
3 5
4 4

Sample Output

4 4
4

思路

不要看题目给你的坐标,我们换一种表示方法

把三角形按三个方向分层,坐标为x,y,z

最后的答案是|x1-x|+|y1-y|+|z1-z|

x=x,y=(y+1)/2,z=x-y/2

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans=2147483647;
int n,m,px,py,sx,sy;
int abs(int x)
{
	return x>0?x:-x;
}
int main()
{
	scanf("%d%d",&n,&m);
	scanf("%d%d",&px,&py);
	for(int i=1; i<=m; i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int s=abs(px-x)+abs((py+1)/2-(y+1)/2)+abs((x-y/2)-(px-py/2));
		if(s<ans)
		{
			ans=s; sx=x; sy=y;
		}
		else if(ans==s)
		{
			if(sx>x||sx==x&&sy>y) sx=x,sy=y;
		}
	}
	printf("%d %d\n",sx,sy);
	printf("%d",ans+1);
}