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