Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. นับผลรวมช่วงใน C++ (Count of Range Sum)

    ภาพรวมปัญหา ให้อาเรย์ nums หาจำนวนช่วง (i, j) ที่ i ≤ j และผลรวม nums[i..j] อยู่ในช่วง [lower, upper] ตัวอย่าง nums = [-3,6,-1], lower = -2, upper = 2 → Output: 2 ช่วง: [0,2] sum=2, [2,2] sum=-2 วิธีแก้ปัญหา: Merge Sort + Prefix Sum ใช้ prefix sum: prefix[i] = sum(nums[0..i-1]) ผลรวมช่วง [i,j] = p

  2. ซองจดหมายรูสเซียใน C++ (Russian Doll Envelopes)

    ภาพรวมปัญหา ให้ซองจดหมายหลายใบ แต่ละใบมี (width, height) ใส่ซองได้ก็ต่อเมื่อ width และ height ทั้งคู่น้อยกว่าอีกใบ หาจำนวนซองสูงสุดที่ซ้อนกันได้ (Longest Increasing Subsequence 2 มิติ) ตัวอย่าง [[5,5], [6,4], [6,8], [2,3]] → Output: 3 ลำดับ: [2,3] → [5,5] → [6,8] วิธีแก้ปัญหา: LIS แบบ Binary Searc

  3. ผลรวมสี่เหลี่ยมผืนผ้าสูงสุดไม่เกิน K ใน C++

    ภาพรวมปัญหา ให้เมทริกซ์ 2D และจำนวนเต็ม k หาผลรวมของสี่เหลี่ยมผืนผ้าย่อย (submatrix) ที่มากที่สุด แต่ไม่เกิน k ตัวอย่าง Matrix = [[1,0,1],[0,-3,2]], k = 3 สี่เหลี่ยมที่ทำเครื่องหมาย: คอลัมน์ 3 (index 2) ทั้ง 2 แถว → 1 + 2 = 3 Output: 3 วิธีแก้ปัญหา: Prefix Sum + BST (Set) ลดปัญหา 2D เหลือ 1D โดย固定

  4. Insert Delete GetRandom O(1) อนุญาตซ้ำใน C++

    ภาพรวมปัญหา ออกแบบโครงสร้างข้อมูลที่รองรับการทำงาน 3 แบบในเวลา O(1) เฉลี่ย: 1. insert(val) — เพิ่มค่า (อนุญาตซ้ำ) 2. remove(val) — ลบค่า 1 ตัว (ถ้ามี) 3. getRandom() — สุ่มคืนค่าจากชุดข้อมูลปัจจุบัน (โอกาสเท่ากันทุกตัว) วิธีแก้ปัญหา: Vector + Hash Map Vector nums: เก็บคู่ {value, index_in_map_vect

  5. กบข้ามแม่น้ำใน C++ (Frog Jump)

    ภาพรวมปัญหา กบอยากข้ามแม่น้ำ โดยกระโดดบนหินที่มีตำแหน่งกำหนด (เรียงจากน้อยไปมาก) กระโดดครั้งแรกต้องเป็น 1 หน่วย หากกระโดดครั้งก่อนเป็น k หน่วย ครั้งถัดไปต้องเป็น k-1, k, หรือ k+1 หน่วย เท่านั้น ตรวจสอบว่ากบข้ามไปหินสุดท้ายได้หรือไม่ ตัวอย่าง stones = [0,1,3,5,6,8,12,17] → Output: true (1) วิธีแก้ป

  6. แบ่งอาเรย์เพื่อให้ผลรวมสูงสุดน้อยที่สุดใน C++

    ภาพรวมปัญหา ให้อาเรย์จำนวนเต็มบวกและจำนวน m แบ่งอาเรย์เป็น m ส่วนย่อยติดต่อกัน (contiguous subarrays) ให้ผลรวมสูงสุดของส่วนย่อยแต่ละส่วนน้อยที่สุด ตัวอย่าง nums = [7,2,4,10,9], m = 2 แบ่งเป็น [7,2,4] (sum=13) และ [10,9] (sum=19) → ผลรวมสูงสุด = 19 วิธีแก้ปัญหา: Dynamic Programming dp[i][j] = ผลรวม

  7. ค่าที่ k เล็กสุดแบบเล็กซิโครกราฟิกใน C++

    ภาพรวมปัญหา หาตัวเลขที่ k เล็กสุดในลำดับเลข 1 ถึง n เมื่อเรียงตามลำดับเล็กซิโครกราฟิก (lexicographical order) ตัวอย่าง n = 14, k = 3 ลำดับ: [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9] ตัวที่ 3 คือ 11 วิธีแก้ปัญหา: นับขั้นตอนระหว่างพรีฟิกซ์ พิจารณาต้นไม้ทริ (Trie) ของตัวเลข 1 ถึง n แต่ละโหนดคือ

  8. ลำดับเลขคณิตย่อยใน C++ (Arithmetic Slices II - Subsequence)

    ภาพรวมปัญหา ให้อาเรย์ A หาจำนวนลำดับย่อย (subsequence) ที่เป็นลำดับเลขคณิต (arithmetic) และมีความยาวอย่างน้อย 3 ตัวอย่าง A = [2,4,6,8,10] → Output: 7 ลำดับเลขคณิต: [2,4,6], [2,4,10], [4,6,8], [6,8,10], [2,4,6,8], [4,6,8,10], [2,4,6,8,10] วิธีแก้ปัญหา: Dynamic Programming ใช้ dp[i][diff] = จำนวนลำด

  9. หมูทดสอบพิษใน C++ (Poor Pigs)

    ภาพรวมปัญหา มีถังทั้งหมด buckets ถัง มีเพียง 1 ถังที่มีพิษ หากหมูดื่มพิษจะตายภายใน minutesToDie นาที ต้องการหาถังพิษภายใน minutesToTest นาที ต้องใช้หมูขั้นต่ำกี่ตัว? ตัวอย่าง buckets = 1000, minutesToDie = 15, minutesToTest = 60 → Output: 5 หลักการแก้ปัญหา แต่ละหมูสามารถทดสอบได้หลายรอบ จำนวนรอบ =

  10. คำต่อกันใน C++ (Concatenated Words)

    ภาพรวมปัญหา ให้รายการคำที่ไม่ซ้ำกัน หาคำทั้งหมดที่เป็น คำต่อกัน (concatenated words) — คือคำที่ประกอบด้วยคำสั้นกว่าอย่างน้อย 2 คำจากในรายการเดียวกัน ตัวอย่าง Input: [cow,cows,cowsgoatcows,goat,goatcowsgoat,hippopotamuses,deer,deercowgoatcow] Output: [cowsgoatcows,goatcowsgoat,deercowgoatcow] วิธีแ

  11. ผลคูณพาลินโดรมสูงสุดใน C++

    ภาพรวมปัญหา หาผลคูณพาลินโดรม (palindrome) ที่มากที่สุดซึ่งได้จากการคูณเลขสองจำนวนที่มี n หลัก แล้วนำผลลัพธ์มาหารเอาเศษด้วย 1337 ตัวอย่าง n = 2 → ตัวเลข 2 หลักมากที่สุดคือ 99 99 × 91 = 9009 (เป็นพาลินโดรม) 9009 mod 1337 = 987 วิธีแก้ปัญหา แทนที่จะลองคูณทุกคู่ (ซึ่งช้า) เราสร้างพาลินโดรมจากตัวเลขมาก

  12. ค่ามัธยฐานแบบหน้าต่างเลื่อนใน C++

    ภาพรวมปัญหา ให้รายการตัวเลขและขนาดหน้าต่าง k เราต้องหาค่ามัธยฐาน (median) ของแต่ละหน้าต่างที่เลื่อนไปทีละหนึ่งตำแหน่งจากซ้ายไปขวา ตัวอย่าง อาเรย์: [1, 3, -1, -3, 5, 3, 6, 8], k = 3 ตำแหน่งหน้าต่างค่ามัธยฐาน [1, 3, -1]1 [3, -1, -3]-1 [-1, -3, 5]-1 [-3, 5, 3]3 [5, 3, 6]5 [3, 6, 8]6 ผลลัพธ์: [1,

  13. Zuma Game: เกมซูมาหาลูกบอลน้อยที่สุดใน C++

    ปัญหา มีแถวลูกบอลบนโต๊ะ (สี: R,Y,B,G,W) และลูกบอลบนมือ ทุกรอบเลือกลูกบอลจากมือ แทรกเข้าแถว → ถ้ามี 3 ลูกติดกันสีเดียวกัน จะหายไป (Chain reaction) หา จำนวนลูกบอลน้อยที่สุด ที่ต้องแทรกเพื่อกำจัดลูกบอลทั้งหมด ไม่ได้คืน -1 ตัวอย่าง: board=WRRBBW, hand=RBW → 3 ลูก แนวคิด: DFS + Backtracking + Pruning

  14. Reverse Pairs: นับคู่ย้อนกลับสำคัญใน C++

    ปัญหา กำหนดอาร์เรย์ หาจำนวน Important Reverse Pairs คือคู่ (i, j) ที่ i < j และ 2 × nums[j] ตัวอย่าง: [2,8,7,7,2] → 3 คู่: (8,2), (7,2), (7,2) (indices: (1,4), (2,4), (3,4)) แนวคิด: Modified Merge Sort (Divide & Conquer) นับคู่ข้ามกลาง (Cross Pairs) ระหว่าง Merge Step Merge Step Modification ปกต

  15. IPO: เพิ่มทุนสูงสุดก่อน IPO ใน C++

    ปัญหา บริษัทต้องการทำ IPO มีโครงการหลายโครงการ แต่ละโครงการมี profit และ capital ต่ำสุดที่ต้องใช้ เริ่มต้นมีทุน W ทำโครงการได้สูงสุด k โครงการ หาทุนสูงสุดสุดท้าย ตัวอย่าง: k=2, W=0, profits=[1,2,4], capitals=[0,1,1] → ทำโครงการ 0 (ได้ 1) → ทุน=1 → ทำโครงการ 2 (ได้ 4) → รวม = 5 แนวคิด: Two Priority

  16. Super Washing Machines: เครื่องซักผ้าซูเปอร์ใน C++

    ปัญหา มีเครื่องซักผ้า n เครื่องเรียงแถว แต่ละเครื่องมีชุดผ้า v[i] ชุด ทุกรอบเลือกเครื่องใดก็ได้ m เครื่อง (1 ≤ m ≤ n) ส่งผ้า 1 ชุดไปเครื่องข้างเคียง (ซ้าย/ขวา) พร้อมกัน หา จำนวนรอบน้อยที่สุด ให้ทุกเครื่องมีผ้าเท่ากัน ไม่ได้คืน -1 ตัวอย่าง: [1,0,5] → 3 รอบ ข้อสังเกตสำคัญ ผลรวมต้องหาร n ลงตัว ไม่งั

  17. Remove Boxes: กำจัดกล่องเพื่อคะแนนสูงสุดใน C++

    ปัญหา มีกล่องสีต่างกัน (แทนด้วยตัวเลข) ทุกรอบเลือกกล่องติดกันสีเดียวกัน k กล่อง กำจัดได้ k² คะแนน หาคะแนนสูงสุด ตัวอย่าง: [1,3,2,2,2,4,4,3,1] → 21 แนวคิด: 3D DP (Interval DP + Extra State) State dp[i][j][k] = คะแนนสูงสุดจากกล่อง i..j โดยมีกล่องสีเดียวกับ boxes[i] ติดมาจากด้านซ้ายอีก k กล่อง Key I

  18. Student Attendance Record II: บันทึกการเข้าเรียนที่ได้รางวัลใน C++

    ปัญหา หาจำนวน Attendance Record ความยาว n ที่ ได้รางวัล (Rewardable) โดย: ตัวอักษร: A (Absent), L (Late), P (Present) เงื่อนไข: สูงสุด 1 A และ ไม่มี L ติดกันเกิน 2 ตัว คำตอบ modulo 10^9 + 7 ตัวอย่าง: n=2 → 8 วิธี: PP, AP, PA, LP, PL, AL, LA, LL (เฉพาะ AA ไม่ได้) แนวคิด: DP แบบ State Machine Sta

  19. Find the Closest Palindrome: หา Palindrome ใกล้ที่สุดใน C++

    ปัญหา กำหนดตัวเลข n (เป็นสตริง) หา Palindrome ที่ ใกล้ที่สุด (Absolute Difference น้อยที่สุด) หากเท่ากันเลือกตัวเล็กกว่า ไม่รวมตัวมันเอง ตัวอย่าง: 145 → 141 (diff=4) ใกล้กว่า 151 (diff=6) แนวคิด: Candidate Generation Palindrome ใกล้ที่สุดต้องอยู่ในกลุ่ม Candidate เหล่านี้: Edge cases: 10^len - 1

  20. Non-negative Integers without Consecutive Ones: จำนวนเต็มไม่ติดลบที่ไม่มี 1 ติดกันใน C++

    ปัญหา กำหนดจำนวนเต็มบวก n หาจำนวนจำนวนเต็มไม่ติดลบ ≤ n ที่ Binary Representation ไม่มี 1 ติดกัน ตัวอย่าง: n = 7 (111₂) → จำนวนที่ถูกต้อง: 0(0), 1(1), 2(10), 4(100), 5(101) → 5 จำนวน แนวคิด: Fibonacci + Digit DP บน Binary ข้อสังเกต จำนวน Binary String ความยาว L ที่ไม่มี 11 คือ Fib(L+2) (Fibonacci)

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:178/301  20-คอมพิวเตอร์/Page Goto:1 172 173 174 175 176 177 178 179 180 181 182 183 184