Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. ปัญหาน้ำและถังใน C++

    มีถังสองใบ ความจุ x และ y ลิตร น้ำไม่จำกัด ต้องการทราบว่า วัดน้ำได้ z ลิตรพอดีหรือไม่ (น้ำอาจอยู่ในถังใดถังหนึ่งหรือทั้งสอง) 操作ที่อนุญาต: เติมน้ำเต็มถัง, เทน้ำทิ้ง, เทน้ำระหว่างถังจนเต็มหรือว่าง ตัวอย่าง: x=3, y=5, z=4 → true ขั้นตอนการแก้ปัญหา (Bézouts Identity / GCD) ถ้า x + y < z → false (น้ำรวม

  2. ชุดย่อยที่หารลงตัวมากที่สุดใน C++

    ให้ชุดจำนวนเต็มบวกที่ไม่ซ้ำกัน หาชุดย่อยขนาดใหญ่ที่สุดที่ทุกคู่ (Si, Sj) สอดคล้อง Si % Sj == 0 หรือ Sj % Si == 0 ตัวอย่าง: [1,2,3] → [1,2] หรือ [1,3] ขั้นตอนการแก้ปัญหา (DP + Backtracking) เรียงอาร์เรย์ nums จากน้อยไปมาก dp[i] = ความยาวชุดย่อยที่หารลงตัวได้มากที่สุดที่ลงท้ายด้วย nums[i] par[i] = in

  3. Super Pow ใน C++

    คำนวณ a^b mod 1337 โดย a เป็นจำนวนเต็มบวก b เป็นจำนวนใหญ่มาก กำหนดเป็นอาร์เรย์หลักฐาน 10 (เช่น b=[1,0] หมายถึง 10) ตัวอย่าง: a=2, b=[1,0] → 1024 (2^10 = 1024) ขั้นตอนการแก้ปัญหา (Modular Exponentiation + Recursion) ฟังก์ชัน powerMod(base, exp): fast exponentiation modulo 1337 ฟังก์ชัน superPow(a, b

  4. ลำดับย่อยแบบ Wiggle ใน C++

    ลำดับ Wiggle = ความต่างระหว่างตัวติดกัน สลับเครื่องหมาย + และ - (อาจเริ่ม + หรือ - ก็ได้) ลำดับน้อยกว่า 2 ตัวเป็น wiggle อัตโนมัติ หาความยาวลำดับย่อย (subsequence) วิกเกิลที่ยาวที่สุด ตัวอย่าง: [1,7,4,9,2,5] → 6 (ทั้งลำดับเป็น wiggle: diff = 6,-3,5,-7,3) ขั้นตอนการแก้ปัญหา (Greedy / DP O(N)) n = nu

  5. สุ่มโหนดใน Linked List ใน C++

    ให้ singly linked list ต้องการสุ่มค่าของโหนดหนึ่งโหนด โดยทุกโหนดต้องมีโอกาสเท่ากัน (Reservoir Sampling บน linked list) ตัวอย่าง: list [1,2,3] → สุ่มได้ 1, 2, หรือ 3 โอกาสเท่ากัน ขั้นตอนการแก้ปัญหา (Reservoir Sampling) เก็บ head ของ linked list getRandom(): ret = -1, len = 1, curr = head วนจน curr

  6. เกมการตัดตัวเลขใน C++

    มีรายการตัวเลข 1 ถึง n เรียงจากซ้ายไปขวา ทำซ้ำ: 1) ตัดจากซ้าย: ลบตัวแรกและทุกตัวคู่ (1,3,5...) 2) ตัดจากขวา: ลบตัวสุดท้ายและทุกตัวคู่จากขวา สลับด้านจนเหลือ 1 ตัว หาตัวสุดท้าย ตัวอย่าง: n=9 → 1,2,3,4,5,6,7,8,9 → (ซ้าย) 2,4,6,8 → (ขวา) 2,6 → (ซ้าย) 6 → คำตอบ 6 ขั้นตอนการแก้ปัญหา (Mathematical Pattern)

  7. การตรวจสอบ UTF-8 ใน C++

    ให้อาร์เรย์จำนวนเต็มแทนไบต์ข้อมูล ตรวจสอบว่าเป็น UTF-8 ที่ถูกต้องหรือไม่ กฎ UTF-8: 1 ไบต์: เริ่มด้วย 0 n ไบต์: เริ่มด้วย n ตัว 1 แล้วตามด้วย 0 ต่อมา n-1 ไบต์ ต้องเริ่มด้วย 10 ตัวอย่าง: [197,130,1] → true (11000101 10000010 00000001 = 2-byte char + 1-byte char) ขั้นตอนการแก้ปัญหา cnt = 0 (จำนวนไบต

  8. ฟังก์ชันหมุนใน C++

    ให้อาร์เรย์ A ความยาว n กำหนด Bk = หมุน A ขวา k ตำแหน่ง ฟังก์ชันหมุน F(k) = Σ i * Bk[i] หา max F(k) สำหรับ k = 0..n-1 ตัวอย่าง: A=[4,3,2,6] → F(0)=25, F(1)=16, F(2)=23, F(3)=26 → คำตอบ 26 ขั้นตอนการแก้ปัญหา (Mathematical Optimization) สังเกตว่า F(k) - F(k-1) = sum(A) - n * A[n-k] คำนวณ F(0) โดยตรง

  9. การแทนที่จำนวนเต็มใน C++

    ให้จำนวนเต็มบวก n ทำการดำเนินการ: ถ้า n คู่ → n = n/2 ถ้า n คี่ → n = n+1 หรือ n = n-1 หาจำนวนขั้นตอนน้อยที่สุดทำให้ n = 1 ตัวอย่าง: 7 → 4 (7→8→4→2→1 หรือ 7→6→3→2→1) ขั้นตอนการแก้ปัญหา (Greedy + Bit Manipulation) ret = 0, ใช้ long long กัน overflow วนจน 1: ถ้า n คู่ → = 1 ถ้า n คี่: ถ้า n == 3

  10. สุ่มดัชนีของตัวเลขเป้าหมายใน C++

    ให้อาร์เรย์มีค่าซ้ำได้ ต้องการสุ่มดัชนีของ target โดยทุกดัชนีที่มีค่าเท่ากับ target ต้องมีโอกาสเท่ากัน (Reservoir Sampling) ตัวอย่าง: nums=[1,2,3,3,3], pick(3) → 2, 3, หรือ 4 แบบสุ่ม ขั้นตอนการแก้ปัญหา (Reservoir Sampling) เก็บอาร์เรย์ไว้ในคลาส pick(target): ret = -1, cnt = 1 วน i = 0..n-1: ถ้า <

  11. ค่า XOR สูงสุดของสองจำนวนในอาร์เรย์ใน C++

    ให้อาร์เรย์ nums หาค่า ai XOR aj สูงสุด (0 ≤ i,j < n) ตัวอย่าง: [3,10,5,25,2,8] → 28 (จาก 5 XOR 25) ขั้นตอนการแก้ปัญหา (Trie บิต) สร้าง Trie บิต (32 ระดับ) ใส่ตัวเลขทุกตัว สำหรับแต่ละตัวเลข x หาคู่ที่ให้ XOR สูงสุด: เดินจากบิต MSB ถึง LSB พยายามเดินทางตรงข้ามบิตของ x (ถ้าบิตของ x = 0 พยายามไปทาง 1

  12. บวกเลขสองจำนวนแบบ Linked List II ใน C++

    ให้ linked list สองตัว แทนจำนวนเต็มไม่ติดลบ (หลักสำคัญอยู่หน้า) ต้องบวกสองจำนวน คืนเป็น linked list ตัวอย่าง: [7,2,4,3] + [5,6,4] = [7,8,0,7] ขั้นตอนการแก้ปัญหา (Stack) สร้าง dummy node ค่า 0, สแต็ก s1, s2 ดึงโนดทั้งสอง list ใส่สแต็กตามลำดับ sum = 0 วนจนสแต็กทั้งสองว่าง: ถ้า s1 ไม่ว่าง pop บวกเข้า

  13. เวลาการทำงานเฉพาะของฟังก์ชันใน C++

    CPU single-threaded รันฟังก์ชันหลายตัว มี log แบบ function_id:start|end:timestamp ต้องการหา exclusive time ของแต่ละฟังก์ชัน (เวลาที่รันจริง ไม่นับเวลาที่ยield ให้ฟังก์ชันอื่น) ตัวอย่าง: n=2, logs=[0:start:0,1:start:2,1:end:5,0:end:6] → [3,4] ขั้นตอนการแก้ปัญหา (Stack) อาร์เรย์ ret[n] เก็บเวลา, สแต็

  14. ข้อเสนอพิเศษการช้อปปิ้งใน C++

    มีร้านขายสินค้าหลายชนิด แต่ละชนิดมีราคาปกติ มีข้อเสนอพิเศษ (special offers) แต่ละอันเป็นอาร์เรย์: ตัวสุดท้าย = ราคา ตัวอื่นๆ = จำนวนสินค้าแต่ละชนิดที่ได้ ต้องการซื้อสินค้าตาม needs ให้ราคาต่ำสุด ตัวอย่าง: ราคา [2,5], โปรโมชัน [[3,0,5],[1,2,10]], ต้องการ [3,2] → คำตอบ 14 (ซื้อโปรโมชันที่ 2 ราคา 10 ได

  15. ทายพรรคชนะใน Dota2 Senate ใน C++

    ใน Dota2 มีพรรค 2 พรรค: Radiant (R) และ Dire (D) สมาชิกวอตในรอบๆ โดยแต่ละรอบแต่ละคนทำได้ 1 ใน 2 อย่าง: 1) ไล่ออกคนอื่น (ban) 2) ประกาศชนะถ้าคนที่เหลืออยู่ทุกคนเป็นพรรคเดียวกัน ทุกคนเล่นอย่างเหมาะสมที่สุด ต้องการทายว่าพรรคไหนชนะ ตัวอย่าง: RDD → Dire (R ไล่ D ตัวที่ 2, D ตัวที่ 3 ไล่ R ตัวแรก, รอบ 2 เ

  16. การชนของดาวเคราะห์น้อยใน C++

    ให้อาร์เรย์ asteroids ค่าสัมบูรณ์ = ขนาด, เครื่องหมาย = ทิศทาง (+ = ขวา, - = ซ้าย) ทุกดาวเคลื่อนที่ความเร็วเท่ากัน เมื่อชนกัน ตัวเล็กจะระเบิด เท่ากันทั้งคู่ระเบิด ทิศทางเดียวกันไม่ชน ตัวอย่าง: [5,10,-5] → [5,10] (10 กับ -5 ชน 10 ชนะ, 5 กับ 10 ไม่ชน) ขั้นตอนการแก้ปัญหา (Stack) สร้างสแต็ก ret วนแต่ละ

  17. ลบและได้คะแนนใน C++

    ให้อาร์เรย์ nums ทำการดำเนินการซ้ำ: เลือก nums[i] ลบออก ได้คะแนน nums[i] แต่ต้องลบ ทุกตัว ที่มีค่า nums[i]-1 และ nums[i]+1 ด้วย หาคะแนนสูงสุดที่ได้ ตัวอย่าง: [3,4,2] → 6 (ลบ 4 ได้ 4 คะแนน 3 ถูกลบอัตโนมัติ แล้วลบ 2 ได้ 2 คะแนน รวม 6) ขั้นตอนการแก้ปัญหา (DP บนค่าที่ไม่ซ้ำ) นับความถี่แต่ละค่าใน map m

  18. การปูกระเบื้องโดมิโนและท्रोมิโนใน C++

    มีกระเบื้อง 2 ประเภท: โดมิโน (Domino) ขนาด 2×1 และ โทรมิโน (Tromino) รูปตัว L (ครอบ 3 ช่อง) สามารถหมุนได้ ทุกช่องบนกระดาน 2×N ต้องถูกปูครบ ทางปูต่างกันก็ต่อเมื่อมีช่องติดกัน 2 ช่องที่ปูต่างกัน ตัวอย่าง: N=3 → 5 วิธี ขั้นตอนการแก้ปัญหา (Dynamic Programming) สร้างอาร์เรย์ dp[N+5] ฐาน: dp[1]=1, dp[2]=

  19. จำนวนย่อยอาร์เรย์ที่ค่าสูงสุดอยู่ในช่วงใน C++

    ให้อาร์เรย์ A ของจำนวนเต็มบวก และขอบเขต L, R ต้องการนับจำนวนย่อยอาร์เรย์ (contiguous, non-empty) ที่ค่าสูงสุด (maximum) อยู่ในช่วง [L, R] ตัวอย่าง: A=[2,1,4,3], L=2, R=3 → 3 (ย่อยอาร์เรย์คือ [2], [2,1], [3]) ขั้นตอนการแก้ปัญหา (DP แบบ O(N)) ret = 0, dp = 0, prev = -1 (prev = ตำแหน่งล่าสุดที่ R) วน

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:167/301  20-คอมพิวเตอร์/Page Goto:1 161 162 163 164 165 166 167 168 169 170 171 172 173