来源:JZOJ
题目描述
众所周知,现代初中生是很有礼貌的社交型学生:每当两个初中生分离后又相遇的时候,它们用“你好!”友好地相互打招呼,馨馨和她的朋友瑶瑶在学校的校园里的一条长长的羊肠小路上散步。
为了便于理解,我们可以把这条羊肠小路看作是一个:一维数轴。 馨馨和瑶瑶都从原点出发,而且她们在散步的这段时间内速度一样。
请根据两个学生各自的散步行动,算出她们互相之间打招呼“你好!”的次数。 经过一段时间之后,她们两个可以在不同的地点停止, 时间有限,两人都不能行走超过 的单位时间。
解题思路
- 这是一道纯模拟,主要是预处理,用两个记录单位时间 馨馨和瑶瑶所在的地点;
- 然后一重循环枚举单位时间,然后判断,如果当前单位时间馨馨和瑶瑶所在点相同而前一单位时间馨馨和瑶瑶所在点不同(因为如果两个人同步同方向行走的时候,只能视为1次相遇);
- 有一个细节需要注意一下:当一个人停止后,每个时刻她所在的地点都是停止时的位置,需要把停止时刻到另一个人的停止时刻(假设另一个人的停止时刻更加靠后)的位置数组补全;
美妙的Code
#include <bits/stdc++.h>
using namespace std;
int a[1000010],b[1000010];
int main()
{
freopen("2019t2.in","r",stdin);
freopen("2019t2.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
int x=0,y=0,tot1=0,tot2=0,sum1=0,sum2=0;
for (int i=1;i<=n;i++)
{
int Len;
char ch;
scanf("%d %c",&Len,&ch);
sum1+=Len;
if (ch=='L')
for (int j=1;j<=Len;j++) x--,a[++tot1]=x; //往左走
else
if (ch=='R')
for (int j=1;j<=Len;j++) x++,a[++tot1]=x; //往右走
}
for (int i=1;i<=m;i++)
{
int Len;
char ch;
scanf("%d %c",&Len,&ch);
sum2+=Len;
if (ch=='L')
for (int j=1;j<=Len;j++) y--,b[++tot2]=y; //往左走
else
if (ch=='R')
for (int j=1;j<=Len;j++) y++,b[++tot2]=y; //往右走
}
int maxt=0;
if (sum1<sum2) //如果第二个人停止时刻更靠后
{
maxt=sum2;
for (int i=sum1+1;i<=sum2;i++) a[++tot1]=x; //补全位置数组
}
else
if (sum1>sum2) //第一个人停止时刻更靠后
{
maxt=sum1;
for (int i=sum2+1;i<=sum1;i++) b[++tot2]=y; ////补全位置数组
}
int ans=0;
for (int i=1;i<=maxt;i++)
if (a[i]==b[i] && a[i-1]!=b[i-1]) //两个人同步同方向行走的时候,只能视为1次相遇
{
ans++;
}
printf("%d",ans); //打印
return 0;
}