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了。