记录编号 24601 评测结果 AAAAAAAAAA
题目名称 拯救奶牛贝希 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.042 s
提交时间 2011-04-12 17:39:57 内存使用 0.37 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cmath>
  3.  
  4. using namespace std;
  5. struct
  6. {
  7. int step;
  8. int x,y;
  9. }
  10. e[10010];
  11. int n,m;
  12. int bx,by;
  13.  
  14. void qsort(int l,int r)
  15. {
  16. int i=l,j=r;
  17. int midx=e[(i+j)>>1].x,midy=e[(i+j)>>1].y;
  18. while(i<j)
  19. {
  20. while((e[i].x<midx)||((e[i].x==midx)&&(e[i].y<midy)))
  21. i++;
  22. while((midx<e[j].x)||((midx==e[j].x)&&(midy<e[j].y)))
  23. j--;
  24. if(i<=j)
  25. {
  26. swap(e[i].x,e[j].x);
  27. swap(e[i].y,e[j].y);
  28. i++;
  29. j--;
  30. }
  31. }
  32. if (l<j)
  33. qsort(l,j);
  34. if (i<r)
  35. qsort(i,r);
  36. }
  37. int deal(int x,int y,int bx,int by)
  38. {
  39. int ans=0,ll,rr;
  40. if (x==bx)
  41. {
  42. ans=abs(y-by)+1;
  43. return ans;
  44. }
  45. if(y%2==0)
  46. {
  47. ll=y-1;
  48. rr=y+(bx-x)*2+1;
  49. if(by<ll)
  50. {
  51. ans=(bx-x)*2+y-by+1;
  52. return ans;
  53. }
  54. if(rr<by)
  55. {
  56. ans=(bx-x)*2+by-(y+(bx-x)*2)+1;
  57. return ans;
  58. }
  59. if(ll<=by&&by<=rr)
  60. {
  61. int zx=ceil((rr*1.0)/2.0)-ceil((by*1.0)/2.0);
  62. if(by%2==0)
  63. ans=zx*2+(bx-x-zx)*2+1;
  64. else
  65. ans=zx*2+(bx-x-zx)*2+2;
  66. return ans;
  67. }
  68. }
  69. else
  70. {
  71. ll=y;
  72. rr=y+(bx-x)*2;
  73. if(by<ll)
  74. {
  75. ans=(bx-x)*2-1+y-by+2;
  76. return ans;
  77. }
  78. if(rr<by)
  79. {
  80. ans=(bx-x)*2-1+by-(y+(bx-x)*2-1)+1;
  81. return ans;
  82. }
  83. if(ll<=by&&by<=rr)
  84. {
  85. int zx=ceil((rr*1.0)/2.0)-ceil((by*1.0)/2.0);
  86. if(by%2==0)
  87. ans=zx*2+(bx-x-zx)*2;
  88. else
  89. ans=zx*2+(bx-x-zx)*2+1;
  90. return ans;
  91. }
  92. }
  93. }
  94. int main()
  95. {
  96. int x,y,i;
  97. int k,ans=0x7fffffff;
  98. freopen("rescuea.in","r",stdin);
  99. freopen("rescuea.out","w",stdout);
  100. scanf("%d%d",&n,&m);
  101. scanf("%d%d",&bx,&by);
  102. for (int i=1;i<=m;i++)
  103. scanf("%d%d",&e[i].x,&e[i].y);
  104. qsort(1,m);
  105. for(i=1;i<=m;i++)
  106. {
  107. x=e[i].x,y=e[i].y;
  108. if(x<=bx)
  109. e[i].step=deal(x,y,bx,by);
  110. else
  111. e[i].step=deal(bx,by,x,y);
  112. }
  113. for(i=1;i<=m;i++)
  114. if(e[i].step<ans)
  115. {
  116. ans=e[i].step;
  117. k=i;
  118. }
  119. printf("%d %d\n%d",e[k].x,e[k].y,ans);
  120. return 0;
  121. }
  122.  
  123.  
  124. /*具体分析:
  125. 贝希(bx,by),目标(x,y)
  126. 始终保持目标在贝希的上面,即,bx>=x
  127. 是同一行的直接左右移动
  128. abs(y1-y2)+1
  129. 先向左下走再朝右下走
  130. 若目标的y是偶数y-1<=by<=y+(bx-x)*2+1
  131. 向左下走(ceil((y+(bx-x)*2+1)/2)-ceil(by/2))*2
  132. 若by是偶数(bx-x-(ceil((y+(bx-x)*2+1)/2)-ceil(by/2)))*2+1
  133. 若by是奇数(bx-x-(ceil((y+(bx-x)*2+1)/2)-ceil(by/2)))*2+2
  134. 若目标的y是奇数y<=by<=y+(bx-x)*2
  135. 向左下走(ceil((y+(bx-x)*2)/2)-ceil(by/2))*2
  136. 若by是偶数(bx-x-(ceil((y+(bx-x)*2)/2)-ceil(by/2)))*2
  137. 若by是奇数(bx-x-(ceil((y+(bx-x)*2)/2)-ceil(by/2)))*2+1
  138. 先左下,再左走
  139. 目标的y是偶数by<y-1
  140. 左下:(bx-x)*2
  141. 左走:y-by+1
  142. 目标的y是奇数by<y
  143. 左下:(bx-x)*2-1
  144. 左走:y-by+2
  145. 先右下,再右走
  146. 目标的y是偶数y+(bx-x)*2+1<by
  147. 右下:(bx-x)*2
  148. 右走:by-(y+(bx-x)*2)+1
  149. 目标的y是奇数y+(bx-x)*2<by
  150. 右下:(bx-x)*2-1
  151. 右走:by-(y+(bx-x)*2-1)+1
  152. */