目录
题目描述
众所周知,奶牛们是非常具有社交礼貌的,任何时候两头奶牛在分开后相遇(上一个时间点不在一起,当前时间点在一起算一次相遇),他们会友好的用“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后面都是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
后面都是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;
}
喜欢点个赞吧!