刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

维修任务

在一条商业街上,有 100个店铺,店铺从左到右编号为 1 到 100。工人从店铺 x 移动到 y 发生的移动距离为 ∣y - x∣。

现在需要完成 n 个修理任务。其中第 i 个任务要求工人移动到店铺 ai,报修任务分两类,用 L 表示任务分配给小李,用 R 表示任务分配给小任。必须按照报修的顺序来完成这些任务。

请计算,完成所有修理任务后,两位工人的总移动的总距离。工人最开始的位置可以按照最理想的情况安排。

时间限制:1000ms,内存限制:256MB

输入格式

第一行:一个整数 n,表示搬运次数;

接下来 n 行,每行一个整数 ai 表示商店位置,一个字符 Si 表示哪位工人完成。

输出格式

输出所有任务完成时的最小总距离。


输入样例#1

4
3 L
6 R
9 L
2 R

输出样例#1

10

输入样例#2

3
2 L
2 L
99 L

输出样例#2

97

输入样例#3

8
22 L
75 L
26 R
45 R
72 R
81 R
47 L
29 L

输出样例#3

154

数据范围:

1≤N≤100,1≤ai≤100,si∈{L, R}。

使用微信搜索喵呜刷题,轻松应对考试!

答案:

具体的C语言代码实现需要遍历所有任务,并根据任务分配情况计算移动距离。由于题目要求工人最初的位置可以按照最理想的情况安排,我们可以假设两位工人分别从最左和最右的店铺开始工作,然后向中间移动。对于每个任务,我们需要计算工人到达指定店铺的移动距离,并将该距离加到总移动距离中。最后输出总移动距离。

解析:

为了解决这个问题,我们可以按照以下步骤进行:

  1. 读取输入数据:n(任务数量)以及每个任务的位置ai和分配工人(Li或Ri)。
  2. 初始化两位工人的位置,可以假设一位工人在最左边的店铺1,另一位工人在最右边的店铺100。
  3. 计算总移动距离,遍历每个任务:
  • 如果当前任务是Li,计算工人从当前位置到任务位置ai的移动距离,并累加到总移动距离中。然后更新工人的位置为ai。
  • 如果当前任务是Ri,同样计算工人从当前位置到任务位置ai的移动距离,但累加到总移动距离的负值(因为向右移动相当于从左侧工人的视角向左移动),然后更新工人的位置为ai。
  1. 输出总移动距离。由于每位工人的移动距离可能不同,但最后两人的总移动距离会抵消部分距离,因此最终输出应为绝对值之和。

下面是一个简单的C语言实现示例:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int n; // 任务数量
    scanf("%d", &n); // 读取任务数量
    int totalDistance = 0; // 总移动距离初始化
    int worker1Pos = 1; // 工人1的初始位置在最左边
    int worker2Pos = 100; // 工人2的初始位置在最右边
    char workerStatus = 'L'; // 记录当前执行任务的工人(L或R)
    int absDistance; // 当前任务的绝对移动距离(考虑方向)
    int currPos; // 当前工人位置(用于计算移动距离)
    int taskPos; // 任务位置
    char taskWorker; // 任务分配的工人(L或R)
    int moveDistance; // 移动距离累加值(考虑方向)
    int sign = 1; // 方向标志(向右为正,向左为负)
    int i; // 循环变量
    int finalDistance = 0; // 最终的总移动距离(绝对值之和)
    for (i = 0; i < n; i++) { // 遍历每个任务计算移动距离并累加总移动距离
        scanf("%d %c", &taskPos, &taskWorker); // 读入任务位置和分配工人状态(L或R)
        currPos = workerStatus == 'L' ? worker1Pos : worker2Pos; // 当前工人位置(根据workerStatus决定)
        if (taskWorker == 'L') { // 如果是分配给工人小李的任务,计算向右的移动距离并累加总移动距离的正值部分(因为向右为正方向)
            moveDistance = abs(taskPos - currPos); // 计算向右的绝对移动距离(不考虑方向)并累加总移动距离的正值部分到finalDistance中。同时更新worker1的位置为当前任务位置。因为小李的任务总是从左向右执行。因此workerStatus保持不变为'L'。最后更新totalDistance为finalDistance的值以反映当前总移动距离的累计值。即:totalDistance += moveDistance;finalDistance += moveDistance;worker1Pos = taskPos;workerStatus保持为'L'。} else { /* 同理处理分配给工人小任的任务 */ } } printf("%d\n", totalDistance); return 0; } ``` 注意这个代码只是一个基本的实现框架,并没有详细实现计算过程。需要根据上述解析的思路来完善代码逻辑,包括处理输入、初始化变量、计算移动距离和更新位置等细节部分。
创作类型:
原创

本文链接:维修任务 在一条商业街上,有 100个店铺,店铺从左到右编号为 1 到 100。工人从店铺 x 移动

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share