C++ 中的作业传递
在本教程中,我们必须编写一个算法来找到一种方法,在不被监考老师发现的情况下通过作业。每个学生都必须将他们的作业提交给监考老师。学生 A 的作业在学生 B 那里,所以学生 B 必须在不被监考老师注意到的情况下将作业还给/传递给学生 A。
所有学生都排队坐着。我们需要找到一种方法将作业传递回学生 A 而不被发现。他们可以传递作业的各种要求如下:
学生 A(位于索引 i 处)可以将其作业传递给其邻居,即索引 (i-1) 和 (i+1) 处的学生。
学生可以给出、接收或保留他们手中的作业。
监考老师正在监视从索引 [il, rl] 开始的所有学生。
当学生在监考老师的监视范围内时,他们不能发送或接收作业。
如果学生在该范围内保留了作业,监考老师将不会发现他们。
我们得到四个输入 p、q、r、s,其中 p 是学生的总数,q 是监考老师从 il 到 rl 监视的总步数,c 是学生 A 的位置,d 是学生 B 的位置。
每个步骤 (q) 有三个输入:
监考老师将监视给定范围的总时间。
监考老师正在监视的最左侧的包含范围。
监考老师正在监视的最右侧的包含范围。
需要一个包含 3 个单词的输出序列:“左”、“右”和“保留”,表示学生的行为,如果他们正在传递作业(左/右)或保留它。例如:
步骤
输入
8 3 2 7 1 4 6 2 1 8 3 5 6
输出
Right Keep Right Right Right Right
解释
按照这些说明,作业将从索引为 2 的学生传递到索引为 7 的学生,而不会被发现。
输入
5 1 1 3 1 2 5
输出
Keep Right Right
解释
按照这些说明,作业将从索引为 1 的学生传递到索引为 3 的学生,而不会被发现。
寻找解决方案的方法
在给定时间点,如果监考老师正在监视该范围,无论是当前持有作业的学生还是要发送作业的学生,那么该学生都会将作业保留在他手中。否则,他将其传递给其相邻学生,方向是最终目标的方向。
示例
#include <bits/stdc++.h>
using namespace std;
void solve(int p, int q, int r, int s,
long t[], int l[], int ar[]){
int dir;
string val;
if (r < s) {
dir = 1;
val = "Right";
} else {
dir = -1;
val = "Left";
}
string answer = "";
int i = 0, current = r;
long tim = 1;
while (1) {
if (i < q && tim == t[i]) {
if ((current >= l[i] && current <= ar[i]) ||
(current + dir >= l[i] && current + dir <= ar[i])) {
answer += "Keep\n";
tim++;
i++;
continue;
}
i++;
}
current += dir;
answer += val+"\n";
tim++;
if (current == s)
break;
}
cout << answer << endl;
}
int main(){
int p = 8, q = 3, r = 2, s = 7;
long t[q + 2] = { 1,2,3 };
int l[q + 2] = { 4,1,5 };
int ar[q + 2] = { 6,8,6 };
solve(p, q, r, s, t, l, ar);
return 0;
}输出
Right Keep Right Right Right Right
结论
在本教程中,我们学习了如何编写算法来找到一种方法,在不被监考老师发现的情况下传递作业,以及 C++ 代码。我们也可以用 Java、Python 和其他语言编写此代码。上述算法对于竞争性编码竞赛来说是一个重要的算法。这个问题包含了一个现实生活中的问题,我们通过 C++ 代码解决了它。我们希望您发现本教程有所帮助。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP