【JZOJ1320】拯救奶牛

description

貝希被困在一個三角形的迷宮之中。這個迷宮有N行(1 <= N <= 1000000)。比如下圖是一個3行的迷宮。


  
  迷宮的第i行有2*i-1個三角形,從左到右分別編號爲(i,1)、(i,2)等等。貝希每次可以從一個三角形走到任意一個一個跟當前的三角形有鄰邊的三角形。比如說,如果她目前處於三角形(3,3),那麼,她可以走到三角形(3,2)、(3,4)和(4,4)。貝希每次需要一分鐘的時間來移動到下一個三角形。

農夫約翰發現貝希被困了!於是她跟蹤貝希的iPhone手機(可憐的觸摸屏~),得知貝希目前處於三角形(Si,Sj)。因爲約翰對貝希有着無窮無盡的濃濃愛意,所以他希望貝希能儘可能快地回到他的身邊。
  在迷宮的三角形之中,有M(1 <= M <= 10000)個是出口。在任何一個出口都可以讓貝希逃離迷宮。一旦貝希進入一個作爲出口的三角形,她用多一分鐘就可以逃離這個迷宮。
  找到一個可以讓貝希逃離迷宮最小時間T,並輸出她應該從哪一個出口逃離迷宮,這個出口記爲(OUTi,OUTj)。如果有多個出口同時需要時間T,輸出那個行的編號小的出口,如果仍然有多個出口,輸出那個列的編號小的。


analysis

  • 把原三角形旋轉一下,看成三個三角形,頂部分別是原三角形最上、最左下和最右下的三個小三角

  • 對於原三角形的側着走,相當於在另兩個三角形中的橫着走

  • 那麼記錄一個點分別在三個三角形中的行數,最小步數即爲三個絕對值的和


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 10005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define O3 __attribute__((optimize("-O3")))

using namespace std;

ll n,begx,begy,begz,ans=INF,where;

struct node
{
	ll x,y,z,x1,y1;
}a[MAXN];

O3 inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
O3 inline bool cmp(node a,node b)
{
	return a.x<b.x || ((a.x==b.x) && (a.y<b.y));
}
O3 int main()
{
	//freopen("T1.in","r",stdin);
	read(),n=read();
	ll x=read(),y=read();
	begx=x,begy=(y+1)/2,begz=x-y/2;
	fo(i,1,n)
	{
		ll x=read(),y=read();
		a[i].x=x,a[i].y=(y+1)/2,a[i].z=x-y/2;
		a[i].x1=x,a[i].y1=y;
	}
	sort(a+1,a+n+1,cmp);
	fo(i,1,n)
	{
		ll temp=abs(begx-a[i].x)+abs(begy-a[i].y)+abs(begz-a[i].z);
		if (temp<ans)ans=temp,where=i;
	}
	printf("%lld %lld\n%lld\n",a[where].x1,a[where].y1,ans+1);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章