【JZOJ A组】拯救奶牛
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,输出那个行的编号小的出口,如果仍然有多个出口,输出那个列的编号小的。
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
思路
不要看题目给你的坐标,我们换一种表示方法
把三角形按三个方向分层,坐标为x,y,z
最后的答案是|x1-x|+|y1-y|+|z1-z|
x=x,y=(y+1)/2,z=x-y/2
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans=2147483647;
int n,m,px,py,sx,sy;
int abs(int x)
{
return x>0?x:-x;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%d%d",&px,&py);
for(int i=1; i<=m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
int s=abs(px-x)+abs((py+1)/2-(y+1)/2)+abs((x-y/2)-(px-py/2));
if(s<ans)
{
ans=s; sx=x; sy=y;
}
else if(ans==s)
{
if(sx>x||sx==x&&sy>y) sx=x,sy=y;
}
}
printf("%d %d\n",sx,sy);
printf("%d",ans+1);
}
上一篇: 【JZOJ A组】荒诞
下一篇: 【JZOJ A组】a
推荐阅读
-
【JZOJ A组】a
-
【JZOJ A组】荒诞
-
【JZOJ A组】拯救奶牛
-
【JZOJ5330】【NOIP提高组模拟】密码(库默尔定理、数位DP)
-
JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
-
JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语
-
SSD+UFS 3.1组RAID 0!联想拯救者Y90手机预热:4K速度提升高达50%
-
SSD+UFS 3.1组RAID 0!联想拯救者Y90手机预热:4K速度提升高达50%
-
JZOJ5397. 【NOIP2017提高A组模拟10.6】Biology
-
JZOJ6893. 【提高组模拟】小 T 与灵石(stone)题解