瑶馨相遇(2019t2.c/cpp/pas)
众所周知,现代初中生是很有礼貌的社交型学生:每当两个初中生分离后又相遇的时候,它们用“你好!”友好地相互打招呼,馨馨和她的朋友瑶瑶在学校的校园里的一条长长的羊肠小路上散步。 为了便于理解,我们可以把这条羊肠小路看作是一个:一维数轴。 馨馨和瑶瑶都从原点出发,而且她们在散步的这段时间内速度一样。 请根据两个学生各自的散步行动,算出她们互相之间打招呼“你好!”的次数。 经过一段时间之后,她们两个可以在不同的地点停止, 时间有限,两人都不能行走超过1,000,000 的单位时间。
【输入】
第一行:两个分开写的整数:B(1 <= B <= 50,000) 和 E(1 <= E <= 50,000)
第2..1+B:这B行描述了馨馨的举动,每一行包含一个正整数表示距离和一个“L”(代表left,左)或者“R”(代表right,右)表示方向。 馨馨不是向左走就是向右走 。
第2+B..1+B+E行: 这E行描述了瑶瑶的举动,每一行包含一个正整数表示距离和一个“L”(代表left,左)或者“R”(代表right,右)表示方向,瑶瑶不是向左走就是向右走 。
【输出】
只有一行:一个整数代表互相问候“你好!”的次数(她们两个最初在原点时在一起没有说“你好!”)
【样例】
输入(2019t2.in) | 输出(2019t2.out) |
4 5 3 L 5 R 1 L 2 R 4 R 1 L 3 L 4 R 2 L | 3
|
【样例解释】
输入解释:馨馨向左走了3个单位时间,然后向右走了5个单位时间,向左走1个单位时间,最后向右走2个单位时间,然后她停在那里; 瑶瑶向右走了4个单位时间,然后向左走了1个单位时间,又向左走3个单位时间,接着向右走4单位时间,最后向左走2个单位时间,然后她停在那里。
输出解释:馨馨和瑶瑶暂时分离后在时间点7,9和13相遇。
题解:将两人每一时刻的位置保存在两个数组中,然后比较每一时刻的位置是否相同,如果相同则相遇一次,需要注意的是:1、当一个人停止的时候,他以后的时刻的位置都是停上时候的位置,需要将位置数组补充完整。
2、当两个人同方向同步行进的时候,只能视为1次相遇
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[10010000],b[10010000];
int main()
{
//freopen("2019t2.in","r",stdin);
//freopen("2019t2.out","w",stdout);
int B,E,t1=0,t2=0,ans=0,x,u=0,v=0,t=0,m=0,y=0; //将两个人每个时间点的位置保存到数组中,最后比较每个时间点的位置是否相同即可
char ch;
cin>>B>>E;
for(int i=1;i<=B;i++)//第一个人总共走过的路程
{
cin>>x>>ch;//x代表第一个人走的距离,ch代表走的方向
t1+=x;//累计第一个人走的总路程
if(ch=='L') //如果往左走,则让位置减1
for(int j=1;j<=x;j++)
{
v--;
a[++u]=v; //将每一个时刻的位置存在数组中
}
if(ch=='R')//如果往右走,则让位置加1
for(int j=1;j<=x;j++)
{
v++;
a[++u]=v;//将每一个时刻的位置存在数组中
}
}
for(int i=1;i<=E;i++)//第二个人总共走过的路程
{
cin>>x>>ch;
t2+=x;
if(ch=='L')
for(int j=1;j<=x;j++)
{
m--;
b[++t]=m;
}
if(ch=='R')
for(int j=1;j<=x;j++)
{
m++;
b[++t]=m;
}
}
if(t1>t2) {
y=t1;//y是两者走的时间长的那个值
for(int i=t2+1;i<=t1;i++)//将第二个人停止后的位置补充完成,值为最后停止时的位置
b[++t]=m;
}
else {
y=t2;
for(int i=t1+1;i<=t2;i++)
a[++u]=v;
}
for(int i=1;i<=y;i++)//如果两者位置相同,而前一时刻位置不同,则相遇次数加1,这里边包含两者同步同方向行走只能记为1次相遇
{
if(a[i]==b[i]&&a[i-1]!=b[i-1]) ans++;
}
cout<<ans;
return 0;
}