记录编号 |
24601 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拯救奶牛贝希 |
最终得分 |
100 |
用户昵称 |
kaaala |
是否通过 |
通过 |
代码语言 |
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
- */