记录编号 24601 评测结果 AAAAAAAAAA
题目名称 拯救奶牛贝希 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.042 s
提交时间 2011-04-12 17:39:57 内存使用 0.37 MiB
显示代码纯文本
#include<iostream>
#include<cmath>

using namespace std;
 
struct
{
    int step;
    int x,y;
}
	e[10010];
 
int n,m;
int bx,by;

void qsort(int l,int r)
{
    int i=l,j=r;
    int midx=e[(i+j)>>1].x,midy=e[(i+j)>>1].y;
    while(i<j)
    {
        while((e[i].x<midx)||((e[i].x==midx)&&(e[i].y<midy))) 
			i++;
        while((midx<e[j].x)||((midx==e[j].x)&&(midy<e[j].y))) 
			j--;
        if(i<=j)
        {
            swap(e[i].x,e[j].x);
            swap(e[i].y,e[j].y);
            i++;
			j--;
        }
    }
    if (l<j) 
		qsort(l,j);
    if (i<r) 
		qsort(i,r);
}
 
int deal(int x,int y,int bx,int by)
{
    int ans=0,ll,rr;
    if (x==bx)
    {
        ans=abs(y-by)+1;
        return ans;
    }
    if(y%2==0)
    {
        ll=y-1;
		rr=y+(bx-x)*2+1;
        if(by<ll)
        {
            ans=(bx-x)*2+y-by+1;
            return ans;
        }
        if(rr<by)
        {
            ans=(bx-x)*2+by-(y+(bx-x)*2)+1;
            return ans;
        }
        if(ll<=by&&by<=rr)
        {
            int zx=ceil((rr*1.0)/2.0)-ceil((by*1.0)/2.0);
            if(by%2==0)
                ans=zx*2+(bx-x-zx)*2+1;
            else
                ans=zx*2+(bx-x-zx)*2+2;
            return ans;
        }
    }
    else
    {
        ll=y;
		rr=y+(bx-x)*2;
        if(by<ll)
        {
            ans=(bx-x)*2-1+y-by+2;
            return ans;
        }
        if(rr<by)
        {
            ans=(bx-x)*2-1+by-(y+(bx-x)*2-1)+1;
            return ans;
        }
        if(ll<=by&&by<=rr)
        {
            int zx=ceil((rr*1.0)/2.0)-ceil((by*1.0)/2.0);
            if(by%2==0)
                ans=zx*2+(bx-x-zx)*2;
            else
                ans=zx*2+(bx-x-zx)*2+1;
            return ans;
        }
    }
}
 
int main()
{
	int x,y,i;
    int k,ans=0x7fffffff;
	freopen("rescuea.in","r",stdin);
	freopen("rescuea.out","w",stdout);
    scanf("%d%d",&n,&m);
    scanf("%d%d",&bx,&by);
    for (int i=1;i<=m;i++)
        scanf("%d%d",&e[i].x,&e[i].y);
    qsort(1,m);
    for(i=1;i<=m;i++)
    {
        x=e[i].x,y=e[i].y;
        if(x<=bx) 
			e[i].step=deal(x,y,bx,by);
        else 
			e[i].step=deal(bx,by,x,y);
    }
    for(i=1;i<=m;i++)
        if(e[i].step<ans)
        {
            ans=e[i].step;
            k=i;
        }
    printf("%d %d\n%d",e[k].x,e[k].y,ans);
	return 0;
}


/*具体分析:
贝希(bx,by),目标(x,y)
始终保持目标在贝希的上面,即,bx>=x
是同一行的直接左右移动
  abs(y1-y2)+1
先向左下走再朝右下走
	若目标的y是偶数y-1<=by<=y+(bx-x)*2+1
	向左下走(ceil((y+(bx-x)*2+1)/2)-ceil(by/2))*2
        若by是偶数(bx-x-(ceil((y+(bx-x)*2+1)/2)-ceil(by/2)))*2+1
        若by是奇数(bx-x-(ceil((y+(bx-x)*2+1)/2)-ceil(by/2)))*2+2         
        若目标的y是奇数y<=by<=y+(bx-x)*2
	向左下走(ceil((y+(bx-x)*2)/2)-ceil(by/2))*2
		若by是偶数(bx-x-(ceil((y+(bx-x)*2)/2)-ceil(by/2)))*2
		若by是奇数(bx-x-(ceil((y+(bx-x)*2)/2)-ceil(by/2)))*2+1
    先左下,再左走
        目标的y是偶数by<y-1
			左下:(bx-x)*2
            左走:y-by+1
        目标的y是奇数by<y
            左下:(bx-x)*2-1
            左走:y-by+2
    先右下,再右走
        目标的y是偶数y+(bx-x)*2+1<by
            右下:(bx-x)*2
            右走:by-(y+(bx-x)*2)+1
        目标的y是奇数y+(bx-x)*2<by
            右下:(bx-x)*2-1
            右走:by-(y+(bx-x)*2-1)+1
*/