Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผ่านการมอบหมายใน 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 เป็นตำแหน่งนิสิต ข.

แต่ละขั้นตอน (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++ เรายังเขียนโค้ดนี้ในภาษาจาวา ไพธอน และภาษาอื่นๆ ได้ด้วย อัลกอริธึมข้างต้นเป็นอัลกอริธึมที่สำคัญสำหรับการแข่งขันการเข้ารหัส คำถามนี้รวมถึงปัญหาในชีวิตจริง ซึ่งเราแก้ไขด้วยโค้ด C++ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์