为爱追寻

来源:互联网 发布:如何登陆阿里云服务器 编辑:程序博客网 时间:2024/04/29 20:50

1 为爱追寻

 

  (lovefinding.pas/c/cpp)

【问题描述】

 

   话说一年半以前,紫萱学姐展开了对杨廷学长的追求。在经历了不懈的努力之后,学姐终于成为了一名……金牌单身狗。但是这位痴情的少女并没有放弃,于是决定在保送之后继续进行这项征程,并为参加比赛的各位在役OI选手送上半熟的狗粮。

   历经了半年的停课之后,学姐回到了陌生又熟悉的班里,但是她已经找不到学长的位置了。于是她决定采用一种高效率的寻找方法:瞎找法。

   我们将学姐的班级视为一个二维平面,每个整数坐标对应一张桌子,学姐从班级的某个位置(x0,y0)开始瞎找,每次检查一下当前所在的这个桌子是谁的,然后进行下一次移动,直到找到学长的桌子(xt,yt),便停止移动。

   给出学姐的初始坐标和每次移动的方向,请你判断在寻找的过程中学姐一共检查了多少张桌子。

 

【输入】

 第一行五个整数n,x0,y0,xt,yt,分别代表学姐移动的次数和学长桌子的坐标。

   接下来n行,第i行两个整数dx,dy,代表学姐第i次移动沿与x/y轴平行的方向移动了dx/dy个单位。如果dx/dy为负数,表示沿x/y轴的反方向移动了-dx/-dy个单位。

 

【输出】

  输出学姐检查过的桌子总数,如果学姐进行完所有移动之后都没有找到学长的桌子,那么输出“SingleDogMZX”(不含引号)。

 

【输入输出样例1

lovefinding.in

lovefinding.out

5 1 1 3 2

1 1

0 -2

0 2

1 0

0 -1

 

4

 

 

【数据范围】

   样例中,检查了(1,1)(2,2),(2,0),(3,2)4张桌子

对于30%的数据,学姐每次移动时不会移动到已经检查过的桌子。

对于60%的数据,任何时刻学姐的横纵坐标都为≤2500的自然数。

对于90%的数据,任何时刻学姐的横纵坐标的绝对值都为≤2500的自然数。

对于100%的数据,任何时刻学姐的横纵坐标的绝对值都为≤10^9的自然数,n≤1000000

 

这道题我一开始只得了60分,可以知道我没有考虑负数的情况,所以才会RE,数组越界。但是这道题得90分还是可以的。

#include<bits/stdc++.h>

using namespace std;

bool a[5010][5010]={};

int dx[1000010]={},dy[1000010]={};

int main()

{

freopen("lovefinding.in","r",stdin);

freopen("lovefinding.out","w",stdout);

int n,xx,yy,xt,yt,sum=0;

scanf("%d%d%d%d%d",&n,&xx,&yy,&xt,&yt);

dx[0]=0;

dy[0]=0;

for (int i=1;i<=n;++i)

scanf("%d%d",&dx[i],&dy[i]);

for (int i=0;i<=n;++i)

{

xx+=dx[i];

yy+=dy[i];

if (xx<0) xx=2500-xx;

if (yy<0) yy=2500-yy;

if (a[xx][yy]==false) sum++;

a[xx][yy]=true;

if (xx>2500) xx=2500-xx;

if (yy>2500) yy=2500-yy;

if (xx==xt&&yy==yt)

{

cout<<sum<<endl;

return 0;

}

}

cout<<"SingleDogMZX"<<endl;

return 0;

}

这就是一道模拟题,从起点开始,按照它给出的移动方式移动,直到到达终点。但是它最后输出的是寻找过的桌子数,看它30%的数据可以发现,之后的数据可能找过的桌子会有重复,所以需要一个二维数组记录一下找过的桌子,而范围就是学姐能到达的坐标的最大值。它90%的数据是坐标绝对值不超过2500,说明坐标可能是负数,所以这需要处理一下,把-1到-2500换成2501-5000,因此二维数组范围就开到5000多。而模拟是从起点开始的,所以我比数据多加了一步操作,我把起点也加进去了。中间循环是主体,先把横纵坐标都进行一波操作,如果它是负数,就把它翻到2500以后,然后二维数组如果为假,就说明这张桌子还没有被找过,那么sum++,然后把这个点标记为真,也就是已访问过。然后你需要判断学姐是否找到了学长,但是这时候的xx和yy已经变了,所以再需要把它变回去,那就逆算一下,然后就ok了。