HAOI2019(普及)t2---馨瑶相遇

瑶馨相遇(2019t2.c/cpp/pas

   

众所周知,现代初中生是很有礼貌的社交型学生:每当两个初中生分离后又相遇的时候,它们用“你好!”友好地相互打招呼,馨馨和她的朋友瑶瑶在学校的校园里的一条长长的羊肠小路上散步。 为了便于理解,我们可以把这条羊肠小路看作是一个:一维数轴。 馨馨和瑶瑶都从原点出发,而且她们在散步的这段时间内速度一样。 请根据两个学生各自的散步行动,算出她们互相之间打招呼“你好!”的次数。 经过一段时间之后,她们两个可以在不同的地点停止, 时间有限,两人都不能行走超过1000000 的单位时间。

 

输入

第一行:两个分开写的整数: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;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值