【2020.2.7 练习赛】 T1-瑶馨相遇-[2019河南省赛初中组](模拟)

来源:JZOJ

题目描述

众所周知,现代初中生是很有礼貌的社交型学生:每当两个初中生分离后又相遇的时候,它们用“你好!”友好地相互打招呼,馨馨和她的朋友瑶瑶在学校的校园里的一条长长的羊肠小路上散步。

为了便于理解,我们可以把这条羊肠小路看作是一个:一维数轴。 馨馨和瑶瑶都从原点出发,而且她们在散步的这段时间内速度一样。

请根据两个学生各自的散步行动,算出她们互相之间打招呼“你好!”的次数。 经过一段时间之后,她们两个可以在不同的地点停止, 时间有限,两人都不能行走超过 1 , 000 , 000 1,000,000 1000000 的单位时间。

解题思路

  • 这是一道纯模拟,主要是预处理,用两个记录单位时间 x x x 馨馨和瑶瑶所在的地点;
  • 然后一重循环枚举单位时间,然后判断,如果当前单位时间馨馨和瑶瑶所在点相同而前一单位时间馨馨和瑶瑶所在点不同(因为如果两个人同步同方向行走的时候,只能视为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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值