Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. โปรแกรมจัดเรียงข้อความให้กว้างเท่ากัน (Text Justification) ใน C++

    ให้รายการคำ และความกว้าง k จัดข้อความให้แต่ละบรรทัดกว้างพอดี k ตัวอักษร จัดเต็ม (fully justified) ยกเว้นบรรทัดสุดท้ายจัดซ้าย ช่องว่างกระจายเท่าๆ กัน ช่องซ้ายได้มากกว่าถ้าไม่หารลงตัว ขั้นตอนการแก้ปัญหา หาคำที่ใส่ได้ในบรรทัดนี้ (width + ความยาวคำ + ช่องว่าง <= k) คำนวณ space = (k - total_width) /

  2. โปรแกรมหาผลรวมสูงสุดของ k สับลิสต์ไม่ทับซ้อนใน C++

    ให้ nums และ k หา k สับลิสต์ (subarrays) ไม่ทับซ้อน ผลรวมของผลรวมแต่ละสับลิสต์ มากที่สุด ตัวอย่าง: nums=[11,-1,2,1,6,-24,11,-9,6], k=3 → 36 เลือก [11,-1,2,1,6] (19), [11] (11), [6] (6) รวม 36 ขั้นตอนการแก้ปัญหา (DP) hi[i] = ผลรวมสูงสุดของ i สับลิสต์ที่จบแล้ว (closed) open[i] = ผลรวมสูงสุดของ i สับล

  3. โปรแกรมตรวจสอบการแบ่ง Partition เป็น k เซตผลรวมเท่ากันใน C++

    ให้ nums และ k ตรวจสอบว่าแบ่ง nums เป็น k เซตที่ผลรวมเท่ากันได้หรือไม่ ตัวอย่าง: nums=[4,2,6,5,1,6,3], k=3 → True ([6,3],[6,2,1],[4,5] ผลรวม 9 ทุกคู่) ขั้นตอนการแก้ปัญหา (Backtracking) ฟังก์ชัน check(v): ตรวจสอบทุกค่าใน v เท่ากันหรือไม่ ฟังก์ชัน dfs(idx, nums, temp): ถ้า idx == n: คืน check(temp)

  4. โปรแกรมหาผลรวมสูงสุดของ 2 เซตที่มีผลรวมเท่ากันใน C++

    ให้รายการตัวเลข nums หา 2 เซตที่ผลรวมเท่ากันและมากที่สุด คืนค่าผลรวมนั้น ตัวอย่าง: nums=[2,5,4,6] → 6 (เซต [2,4] และ [6]) ขั้นตอนการแก้ปัญหา (DP) sum = ผลรวมทั้งหมด dp[i][j] = ผลรวมสูงสุดของเซตแรก เมื่อพิจารณา i ตัวแรก และความต่างระหว่าง 2 เซตคือ j-sum (shift ด้วย sum) dp[0][sum] = 0 สำหรับแต่ละตัว

  5. โปรแกรมหา Prefix ยาวที่สุดที่เป็น Suffix ด้วยใน C++

    ให้สตริง s หา prefix ยาวที่สุดที่เป็น suffix เช่นกัน (ไม่นับสตริงทั้งหมด) ถ้าไม่มีคืนสตริงว่าง ตัวอย่าง: helloworldhello → hello (prefix hello = suffix hello) ขั้นตอนการแก้ปัญหา (KMP LPS Array) สร้าง LPS Array (Longest Prefix Suffix) ขนาด n LPS[i] = ความยาว prefix สูงสุดที่เป็น suffix ของ s[0..i] ใ

  6. โปรแกรมหาช่วงที่ดีที่สุดให้ลบเพื่อให้เหลือช่วงมากที่สุดใน C++

    ให้รายการช่วง (intervals) ที่อาจทับซ้อนกัน ลบ 1 ช่วง แล้ว merge ช่วงที่เหลือ หาจำนวนช่วงสูงสุดที่เหลือได้ ตัวอย่าง: intervals = [[5,8],[6,7],[7,10],[9,11]] ลบ [7,10] → เหลือ [5,8] และ [9,11] = 2 ช่วง (สูงสุด) ขั้นตอนการแก้ปัญหา (DP + Memoization) เรียงช่วงตามจุดเริ่มต้น ฟังก์ชัน countIntervals(i, e

  7. โปรแกรมหา Permutation ถัดไปของตัวเลขใน C++

    ให้ตัวเลข n หา permutation ถัดไปที่มากกว่าเดิม (เรียงตัวเลข) ถ้าเป็น permutation สุดท้ายแล้ว ให้กลับไป permutation แรก (น้อยที่สุด) ตัวอย่าง: n=319 → 391 ขั้นตอนการแก้ปัญหา (Next Permutation Algorithm) แปลงตัวเลขเป็นอาร์เรย์หลัก หา index i จากขวาไปซ้าย ที่ a[i] < a[i+1] หา index j จากขวาไปซ้าย ท

  8. โปรแกรมหาจำนวนขั้นตอนน้อยสุดลด n เป็น 0 ใน C++

    ให้ตัวเลข n ดำเนินการได้ 3 แบบ: 1) ลด 1, 2) ถ้าเลขคู่ ลด n/2, 3) ถ้าหาร 3 ลงตัว ลด 2×(n/3) หาขั้นตอนน้อยสุดถึง 0 ตัวอย่าง: n=16 → 5 ขั้นตอน (16→8→4→2→1→0) ขั้นตอนการแก้ปัญหา (DP + Memoization) dp[x] = คำตอบสำหรับ x dfs(x): ถ้า x <= 0: คืน x ถ้า x == 1: คืน 1 md2 = x%2, md3 = x%3 ret = min(x, md

  9. โปรแกรมหาจำนวนแพ็กเกจสูงสุดที่ขายได้ให้ผู้ซื้อใน C++

    มีรายการขาย sales=[[day,price]] และผู้ซื้อ buyers=[[payday,amount]] ผู้ซื้อซื้อได้สูงสุด 1 ชิ้น แพ็กเกจขายได้ 1 คน หาจำนวนแพ็กเกจขายได้สูงสุด ตัวอย่าง: sales=[[0,5],[0,5],[0,6],[1,4],[1,5],[3,4]], buyers=[[0,4],[0,6],[1,5]] → 3 ขั้นตอนการแก้ปัญหา เรียง buyers ตาม payday แล้ว amount เรียง sales ตาม

  10. โปรแกรมตรวจสอบว่าคำสอดคล้องกับรูปแบบ (Pattern) ใน C++

    ให้ pattern p และสตริง str ต้องการตรวจสอบว่า str ตาม pattern p หรือไม่ โดยมี bijection ระหว่างตัวอักษรใน pattern กับคำใน str ตัวอย่าง: pattern=cbbc, str=word pattern pattern word → True c→word, b→pattern ขั้นตอนการแก้ปัญหา แยก str เป็นคำๆ ใส่ vector words สร้าง encoding pattern: ให้ตัวอักษรใหม่แต่ล

  11. โปรแกรมหาผลรวมสูงสุดจากการเลือกค่าสูงสุดแล้วลดลง 1 ทีละ k ครั้งใน C++

    ให้อาร์เรย์ arr[] และจำนวน m ต้องการเลือกค่าสูงสุด m ครั้ง ทุกครั้งหลังเลือกแล้วลดค่าลง 1 หาผลรวมสูงสุด ตัวอย่าง: arr=[3,6,7,8,8], k=3 รอบ1: max=8, sum=8, arr=[3,6,7,7,8] รอบ2: max=8, sum=16, arr=[3,6,7,7,7] รอบ3: max=7, sum=23, arr=[3,6,6,7,7] ผลลัพธ์ = 23 วิธีแก้ปัญหา ใช้ Max Heap (Priority Queue)

  12. โปรแกรมนับวิธีวาดเส้นเชื่อมโหนดบนวงกลมไม่ให้ทับซ้อนใน C++

    มี n โหนดวางวงกลม ต้องการวาด n/2 เส้นเชื่อม ทุกโหนดถูกเชื่อม 1 เส้น และเส้นไม่ทับซ้อน หาจำนวนวิธี mod 10⁹+7 ตัวอย่าง: n=4 → 2 วิธี (Catalan Number C₂ = 2) ขั้นตอนการแก้ปัญหา นี่คือ Catalan Numbers: C₀=1, C₁=1, Cₙ = Σ Cᵢ₋₁ × Cₙ₋ᵢ ใช้ DP: dp[i] = จำนวนวิธีสำหรับ 2i โหนด dp[i] = Σ 2×dp[j-1]×dp[i-j] (j=

  13. โปรแกรมตอบคำถามจำนวนจำนวนเต็มที่ไม่ซ้ำใน Suffix ใน C++

    ให้อาร์เรย์ arr[] ขนาด n และ Q คำถาม แต่ละคำถามมี k ต้องการหาจำนวนค่าที่ไม่ซ้ำใน arr[k..n-1] (1-indexed) ตัวอย่าง: arr = [5,1,2,1,6,5], queries = {1,3,4} k=1: [5,1,2,1,6,5] → {5,1,2,6} = 4 k=3: [2,1,6,5] → {2,1,6,5} = 4 k=4: [1,6,5] → {1,6,5} = 3 วิธีแก้ปัญหาที่มีประสิทธิภาพ คำนวณล่วงหน้า (Precomput

  14. โปรแกรมตรวจสอบว่าตัวเลขอยู่ในช่วงใดช่วงหนึ่งจาก N ช่วงใน C++

    ให้เมทริกซ์ 2 มิติ arr[][2] แทน n ช่วง (L, R) และ Q คำถาม แต่ละคำถามเป็นตัวเลข ต้องการตรวจสอบว่าตัวเลขอยู่ในช่วงไหนช่วงหนึ่ง (ช่วงไม่ทับซ้อนกัน) ตัวอย่าง: arr = {{5,7},{1,3},{9,12}}, queries = {10,4} 10 อยู่ใน [9,12] → Yes, 4 ไม่อยู่ช่วงไหน → No อัลกอริทึม เรียงช่วงตามค่า L แต่ละคำถาม: วนตรวจสอบทุก

  15. โปรแกรมตรวจสอบการเชื่อมกล่องบนวงกลมไม่ให้ทับซ้อนใน C++

    มี n กล่องวางอยู่บนขอบวงกลม และ Q คำถาม แต่ละคำถามมี (a,b) ต้องการทราบว่าสามารถเชื่อมกล่อง a กับ b ด้วยไม้กั้นได้หรือไม่ โดยไม่ให้ทับกับการเชื่อมก่อนหน้า ตัวอย่าง: n=6, Q=3, queries={{1,3},{2,5},{4,5}} ผลลัพธ์: Possible, Not possible, Possible วิธีแก้ปัญหา เก็บการเชื่อมล่าสุดเป็นอ้างอิง (ref1, ref2)

  16. โปรแกรมนับจำนวนเมทริกซ์ย่อยสี่เหลี่ยมที่มีแต่ 1 ใน C++

    ให้เมทริกซ์ไบนารี 2 มิติ ต้องการนับจำนวนเมทริกซ์ย่อย (ทุกรูปทรงสี่เหลี่ยม) ที่ประกอบด้วย 1 ทุกเซลล์ ตัวอย่าง: 1 1 0 1 1 0 0 0 1 ผลลัพธ์ = 10 (1×1: 5, 2×1: 2, 1×2: 2, 2×2: 1) ขั้นตอนการแก้ปัญหา สร้างฟังก์ชัน getAns(a) ใช้อัลกอริทึม Monotonic Stack นับสี่เหลี่ยมในฮิสโตแกรม หลักการ: แปลงแต่ละแถวเป็นฮิ

  17. โปรแกรมตรวจสอบว่าส่วนย่อยสตริงเป็นพาลินโดรมด้วยคำถามหลายคำถามใน C++

    ให้สตริง str และ Q คำถาม แต่ละคำถามมี L, R ต้องการตรวจสอบว่า substring[L..R] เป็นพาลินโดรมหรือไม่ ตัวอย่าง: str = abccbeba, Q=3, queries = {{1,4},{0,6},{4,6}} [1,4]=bccb→Palindrome, [0,6]=abccbeb→Not, [4,6]=beb→Palindrome วิธีแก้ปัญหา วิธีง่าย (Naive): ตรวจสอบแต่ละคำถามแยกกัน O(N) ต่อคำถาม วิธีมีประ

  18. โปรแกรมตอบคำถามหาความต่างดัชนีของค่าที่เล็กที่สุด L และ R ใน C++

    ให้อาร์เรย์ arr[] ขนาด n และ Q คำถาม แต่ละคำถามมี L, R ต้องการหาความต่างสัมบูรณ์ของดัชนีระหว่างค่าที่เล็กที่สุดอันดับ L และอันดับ R ตัวอย่าง: arr = [8,4,1,5,2], Q=2, queries = {{2,4},{1,5}} คำถาม {2,4}: ค่าที่ 2 คือ 2 (ดัชนี 4), ค่าที่ 4 คือ 5 (ดัชนี 3) → |4-3|=1 คำถาม {1,5}: ค่าที่ 1 คือ 1 (ดัชนี 2

  19. โปรแกรมนับจำนวนการดำเนินการลบสับลิสต์พาลินโดรมใน C++

    ให้ลิสต์ตัวเลข nums ดำเนินการลบสับลิสต์ที่เป็นพาลินโดรม หาจำนวนครั้งน้อยที่สุดเพื่อให้ลิสต์ว่างเปล่า ตัวอย่าง: nums = [6, 2, 4, 4, 2, 10, 6] → 2 ครั้ง ลบ [2,4,4,2] ก่อน เหลือ [6,10,6] ซึ่งเป็นพาลินโดรม ลบอีกครั้งจบ ขั้นตอนการแก้ปัญหา (DP + Memoization) dp[105][105] เริ่มต้น -1 ฟังก์ชัน dfs(i, j, v)

  20. โปรแกรมตรวจสอบว่าแทนที่ตัวอักษรได้เป็นสตริงเป้าหมายหรือไม่ใน C++

    ให้สตริง s และ t ตัวพิมพ์เล็ก ทำการดำเนินการ: เลือกตัวอักษรใน s แล้วแทนที่ทุกครั้งที่ปรากฏด้วยตัวอักษรอื่น ทำซ้ำได้ไม่จำกัดครั้ง ต้องการทราบว่า s สามารถกลายเป็น t ได้หรือไม่ ตัวอย่าง: s = eye, t = pip → True (แทนที่ e→p, y→i) ขั้นตอนการแก้ปัญหา สร้าง Map m1 (char → char) วนลูป i = 0 ถึง n-1: ถ้า s

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:236/301  20-คอมพิวเตอร์/Page Goto:1 230 231 232 233 234 235 236 237 238 239 240 241 242