Meet and Greet[USACO-2012-Dec-B](模拟)

目录

题目描述

输入格式

输出格式

输入输出样列

说明

代码部分

每个时间点行走的状态。

补齐

判断

综合代码

1.有注释

2.无注释

题目描述

众所周知,奶牛们是非常具有社交礼貌的,任何时候两头奶牛在分开后相遇(上一个时间点不在一起,当前时间点在一起算一次相遇),他们会友好的用“moo”互相问候。
奶牛Bessie和她的好朋友Elsie正沿着FJ的农场散步。我们将她们散步的道路看做是一个一维的数轴。Bessie和Elsie都从原点开始出发,她们步行的速度也是相同的。
给出每头奶牛的运动描述,请计算出她们相互问候“moo”的次数。
Bessie和Elsie可以在不同的时间点停止运动,而且两个奶牛的运动时间都不会超过1000000单位的时间。

输入格式

第一行,两个整数B和E,1≤B≤50000,1≤E≤50000
接下来B行,描述Beiise的运动轨迹,每行一个整数和一个字符(字符是L或者是R),表示Bessie向左或者向右运动的时间
接下面E行,描述Elsie的运动轨迹,每行一个整数和一个字符(字符是L或者是R),表示Elsie向左或者向右运动的时间

输出格式

一行,一个整数,表示他们相互问候“moo”的次数,两头牛在起点出发时,不会问候“moo”

输入输出样列

输入样例1:

4 5
3 L
5 R
1 L
2 R
4 R
1 L
3 L
4 R
2 L

输出样例1:

3

说明

样例说明:
Bessie向左移动3个单位时间,然后向右移动5个单位时间,然后向左移动1个单位的时间,最后向右移动2个单位的时间,然后她静止不动。
Elsie向右移4个单位,然后向左移动1个单位时间,然后向左移动3个单位的时间,然后向右移动4个单位的时间,然后向左移动2个单位的时间,然后停滞不前。
Bessie和Elsie分开后见面,相互问候的时间是时间7、时间9和时间13.一共3次。

Bessie: 0   1   2    3   4   5   6  7  8  9 10 11 12 13 14 15 16 17 18 19 20--时间

-----------0  -1  -2  -3  -2  -1   0  1  2  1  2   3   3   3   3   3   3   3   3   3   3

---------------------------------------- *       *                 *

-----------0   1   2    3   4   3   2  1  0  1  2   3   4   3   2   2   2   2   2   2   2

Elsie:    0   1   2    3   4   5   6  7  8  9 10 11 12 13 14 15 16 17 18 19 20--时间

由此可见时间点7,9,13,一共3次

为什么11点不行?

代码部分

因为是

在分开后相遇(上一个时间点不在一起,当前时间点在一起算一次相遇)

SO

每个时间点行走的状态。


	for(int i=1;i<=n;i++){//Bessie:nb
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t1++;//时间点增加
				nb[t1]=nb[t1-1]-1;//记录--是向左走,所以是上一个时间点状态减一。
			}
		}else{
			for(int j=1;j<=x;j++){
				t1++;//时间点增加
				nb[t1]=nb[t1-1]+1;//记录--是向右走,所以是上一个时间点状态加一。
			}
		}
	}


	for(int i=1;i<=m;i++){//Elsie:f5
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t2++;//时间点增加
				f5[t2]=f5[t2-1]-1;//记录--是向左走,所以是上一个时间点状态减一。
			}
		}else{
			for(int j=1;j<=x;j++){
				t2++;//时间点增加
				f5[t2]=f5[t2-1]+1;//记录--是向右走,所以是上一个时间点状态加一。
			}
		}
	}

因为最后要与时间多的奶牛时间补齐

Bessie: 0   1   2    3   4   5   6  7  8  9 10 11 12 13 14--时间

             0  -1  -2  -3  -2  -1   0  1  2  1  2   3   3   3   3\leftarrow后面都是3是因为要和EIsie补齐                                                 *       *                 *

             0   1   2    3   4   3   2  1  0  1  2   3   4   3   2   

Elsie:    0   1   2    3   4   5   6  7  8  9 10 11 12 13 14 --时间

由此可见时间点7,9,13,一共3次

Bessie: 0   1   2    3   4   5   6  7  8  9 10 11 12 13 14--时间

-----------0  -1  -2  -3  -2  -1   0  1  2  1  2   3   3   3   3\leftarrow后面都是3是因为要和EIsie补齐

-----------------------------------------*      *                  *

-----------0   1   2    3   4   3   2  1  0  1  2   3   4   3   2

Elsie:    0   1   2    3   4   5   6  7  8  9 10 11 12 13 14 --时间

由此可见时间点7,9,13,一共3次

补齐

#include<bits/stdc++.h>
int nb[1000010],f5[1000010];
using namespace std;
int main(){
	int n,m,t1=0,t2=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t1++;
				nb[t1]=nb[t1-1]-1;
			}
		}else{
			for(int j=1;j<=x;j++){
				t1++;
				nb[t1]=nb[t1-1]+1;
			}
		}
	}
	for(int i=1;i<=m;i++){
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t2++;
				f5[t2]=f5[t2-1]-1;
			}
		}else{
			for(int j=1;j<=x;j++){
				t2++;
				f5[t2]=f5[t2-1]+1;
			}
		}
	}
//不算t1==t2的情况
	if(t1<t2){
		for(int j=t1+1;j<=t2;j++){//从Bessie最后一个标记+1,到Elsie最后一个标记
			nb[j]=nb[t1];//t1=Bessie最后一个数的标记
		} 
	}else if(t2<t1){
		for(int j=t2+1;j<=t1;j++){//从Elsie最后一个标记+1,到Bessie最后一个标记
			f5[j]=f5[t2];//t2=Elsie最后一个数的标记
		} 
	}

判断

最后判断一下是否是分开后又相遇的

​
	int cnt=0;
	for(int i=1;i<=max(t1,t2);i++){//取最大的时间点
		if(nb[i-1]!=f5[i-1]&&nb[i]==f5[i]){
        //如果Bessie的上一次不等于Elsie的上一次且现在这个时间点状态都是一样的。
			cnt++;//记录次数
		}
	}
	cout<<cnt;

​

综合代码

1.有注释

#include<bits/stdc++.h>
int nb[1000010],f5[1000010];
using namespace std;
int main(){
	int n,m,t1=0,t2=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){//Bessie:nb
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t1++;//时间点增加
				nb[t1]=nb[t1-1]-1;//记录--是向左走,所以是上一个时间点状态减一。
			}
		}else{
			for(int j=1;j<=x;j++){
				t1++;//时间点增加
				nb[t1]=nb[t1-1]+1;//记录--是向右走,所以是上一个时间点状态加一。
			}
		}
	}
	for(int i=1;i<=m;i++){//Elsie:f5
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t2++;//时间点增加
				f5[t2]=f5[t2-1]-1;//记录--是向左走,所以是上一个时间点状态减一。
			}
		}else{
			for(int j=1;j<=x;j++){
				t2++;//时间点增加
				f5[t2]=f5[t2-1]+1;//记录--是向右走,所以是上一个时间点状态加一。
			}
		}
	}
	//不算t1==t2的情况
	if(t1<t2){
		for(int j=t1+1;j<=t2;j++){//从Bessie最后一个标记+1,到Elsie最后一个标记
			nb[j]=nb[t1];//t1=Bessie最后一个数的标记
		} 
	}else if(t2<t1){
		for(int j=t2+1;j<=t1;j++){//从Elsie最后一个标记+1,到Bessie最后一个标记
			f5[j]=f5[t2];//t2=Elsie最后一个数的标记
		} 
	}
	int cnt=0;
	for(int i=1;i<=max(t1,t2);i++){//取最大的时间点
		if(nb[i-1]!=f5[i-1]&&nb[i]==f5[i]){
        //如果Bessie的上一次不等于Elsie的上一次且现在这个时间点状态都是一样的。
			cnt++;//记录次数
		}
	}
	cout<<cnt;
	return 0;
}

2.无注释

#include<bits/stdc++.h>
int nb[1000010],f5[1000010];
using namespace std;
int main(){
	int n,m,t1=0,t2=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t1++;
				nb[t1]=nb[t1-1]-1;
			}
		}else{
			for(int j=1;j<=x;j++){
				t1++;
				nb[t1]=nb[t1-1]+1;
			}
		}
	}
	for(int i=1;i<=m;i++){
		int x;
		char c;
		cin>>x>>c;
		if(c=='L'){
			for(int j=1;j<=x;j++){
				t2++;
				f5[t2]=f5[t2-1]-1;
			}
		}else{
			for(int j=1;j<=x;j++){
				t2++;
				f5[t2]=f5[t2-1]+1;
			}
		}
	}
	if(t1<t2){
		for(int j=t1+1;j<=t2;j++){
			nb[j]=nb[t1];
		} 
	}else if(t2<t1){
		for(int j=t2+1;j<=t1;j++){
			f5[j]=f5[t2];
		} 
	}
	int cnt=0;
	for(int i=1;i<=max(t1,t2);i++){
		if(nb[i-1]!=f5[i-1]&&nb[i]==f5[i]){
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

喜欢点个赞吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值