Description

贝希被困在一个三角形的迷宫之中。这个迷宫有N行(1 <= N <= 1000000)。比如下图是一个3行的迷宫。
  【Usaco2009 gold 】拯救奶牛-冯金伟博客园
  迷宫的第i行有2*i-1个三角形,从左到右分别编号为(i,1)、(i,2)等等。贝希每次可以从一个三角形走到任意一个一个跟当前的三角形有邻边的三角形。比如说,如果她目前处于三角形(3,3),那么,她可以走到三角形(3,2)、(3,4)和(4,4)。贝希每次需要一分钟的时间来移动到下一个三角形。
  【Usaco2009 gold 】拯救奶牛-冯金伟博客园
  农夫约翰发现贝希被困了!于是她跟踪贝希的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

solution

这题感觉就是乱搞搞求个答案就可以了的说。。。
可能代码你们看不懂。。。(我打的很丑**(⊙o⊙)…**)

code

#include<cstdio>
using namespace std;
int n,m,x1,y1,ansx,ansy,ans=(1<<30),s;

inline int read()
{
	int x=0; char c=getchar();
	while (c<'0' || c>'9') c=getchar();
	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;
}

void doit(int x,int y,int x1,int y1)
{
	int le,ri,cg=0;
	if (! (y & 1)) x--,y--,cg--;
	if (y1 & 1) x1++,y1++,cg--;
	le=y+1,ri=y+(x1-x<<1)-1;
	s=(x1-x<<1)-1+cg+1;
	if (y1<le) s+=le-y1;
	else if (y1>ri) s+=y1-ri;
}

int main()
{
	freopen("save.in","r",stdin);
	freopen("save.out","w",stdout);
	n=read(),m=read();
	x1=read(),y1=read();
	for (int i=1,x,y;i<=m;i++)
	{
		x=read(),y=read();
		if (x<x1)
		{
			doit(x,y,x1,y1);
			if (s<ans) ans=s,ansx=x,ansy=y;
			else if (s==ans && y<ansy) ansx=x,ansy=y;
		}
		else
		{
			doit(x1,y1,x,y);
			if (s<ans) ans=s,ansx=x,ansy=y;
			else if (s==ans && y<ansy) ansx=x,ansy=y;
		}
	}
	printf("%d %d
%d
",ansx,ansy,ans);
	return 0;
}

转载需注明出处。