ACWING/1995. 见面与问候

该博客介绍了一个编程问题,涉及模拟牛在特定路径上的行走,寻找它们相遇的次数。输入包括两组牛的起始位置和移动方向,输出是相遇的次数。通过构建两个数组分别记录每头牛在每个时间点的位置,然后比较它们是否在同一位置来确定相遇。博客提供了C++代码实现,并给出了样例解释和解题思路。
摘要由CSDN通过智能技术生成

在这里插入图片描述

数据范围

1≤B,E≤50000

输入样例:
4 5
3 L
5 R
1 L
2 R
4 R
1 L
3 L
4 R
2 L
输出样例:
3
样例解释

贝茜和艾希在时间 7,9,13 碰面打招呼。

题解

模拟方法解决

  1. 首先将输入固定化到两个index数组,index数组存储每一秒牛所在的位置,index记录长度为最长运动时间那头牛决定,0s的时候位置在0(注意这是因为他们的速度都是1单位/s)
  2. 然后判断两头牛在每个时间节点所处的位置是否相同
  3. 此外注意特例初始位置两头牛的相遇不算
  4. 注意两头相遇且并排走了一段路只算遇到的开始为相遇。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc, char** argv) {
    int b,e;
    cin>>b>>e;
    int b_arr[b];
    for(int i = 0;i<b;i++){
        cin>>b_arr[i];
        char c;
        cin>>c;
        if(c == 'L') b_arr[i] = -b_arr[i];
    }
    int e_arr[e];
    for(int i = 0;i<e;i++){
        cin>>e_arr[i];
        char c;
        cin>>c;
        if(c == 'L') e_arr[i] = -e_arr[i];
    }

    vector<int> b_index,e_index;
    b_index.push_back(0);
    for(int i = 0;i<b;i++){
        // 记录每个时间点b所在的位置
        for(int j = 0;j<abs(b_arr[i]);j++){
            if(b_arr[i]<0) b_index.push_back(b_index[b_index.size()-1]-1); // 相对上一个时钟想左走
            else b_index.push_back(b_index[b_index.size()-1]+1);
        }
    }
    e_index.push_back(0);
    for(int i = 0;i<e;i++){
        // 记录每个时间点b所在的位置
        for(int j = 0;j<abs(e_arr[i]);j++){
            if(e_arr[i]<0) e_index.push_back(e_index[e_index.size()-1]-1); // 相对上一个时钟想左走
            else e_index.push_back(e_index[e_index.size()-1]+1);
        }
    }

    // 延续两者的时间位置到一样长度
    while(e_index.size()<b_index.size()){
        e_index.push_back(e_index[e_index.size()-1]);
    }
    while(b_index.size()<e_index.size()){
        b_index.push_back(b_index[b_index.size()-1]);
    }

    int ans = 0;
    int flag = 1; // 表示是否相遇,注意每次不相遇后再次相遇才会叫
    for(int i = 1;i<e_index.size();i++){
        if(e_index[i] == b_index[i] and flag == 0){
            // 相遇且之前并不并排走,则算相遇一次
            ans++,flag = 1;
        }
        else if(e_index[i] == b_index[i] and flag == 1) {
            // 保持并排,不算相遇
            continue; 
        }
        else{
            // 错开了    
            flag = 0; 
        }
    }


    cout<<ans<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlwaysDayOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值