แผนการเรียน
/

Day 01: Practice Session
C++ Syntax & Fast I/O

เวลา 15.00 - 17.00 น.: เปลี่ยนความรู้เป็นทักษะการเขียนโปรแกรม

รายการโจทย์สำหรับการฝึก

1
Hello World: ตรวจสอบการตั้งค่า Environment
2
R2: พื้นฐานตัวแปรและการคำนวณ
3
Quadrant Selection: การใช้เงื่อนไข (If-Else)
4
Enormous Input Test: พลังของ Fast I/O

Problem 1: Hello World (Kattis: hello)

เป้าหมาย: พิมพ์ข้อความ "Hello World!" ออกทางหน้าจอให้ถูกต้องแม่นยำ

Input:

ไม่มีข้อมูลนำเข้า

Output:

Hello World!

*ใช้สำหรับทดสอบว่า Compiler และ Online Judge ทำงานร่วมกันได้ปกติ

Step-by-Step Logic

1 รวมไลบรารี #include <iostream> เพื่อใช้คำสั่งแสดงผล
2 ใช้ using namespace std; เพื่อความสะดวกในการเรียกใช้ cout
int main() {
  cout << "Hello World!" << endl;
  return 0;
}

Problem 2: R2 (Kattis: r2)

โจทย์: กำหนดให้ \(S = (R1 + R2) / 2\) ถ้าเรารู้ค่า \(R1\) และ \(S\) จงหาค่า \(R2\)

Sample Input:

11 15

Sample Output:

19

Step-by-Step Logic

1 วิเคราะห์สูตร: จาก \(S = (R1 + R2) / 2\) ย้ายข้างได้เป็น \(R2 = 2S - R1\)
2 ประกาศตัวแปร: ใช้ int r1, s; รับค่าผ่าน cin >> r1 >> s;
int r1, s;
cin >> r1 >> s;
cout << (2 * s) - r1 << endl;

Problem 3: Quadrant Selection (Kattis: quadrant)

จงระบุว่าพิกัด \((x, y)\) อยู่ในจตุภาค (Quadrant) ใด :

  • Q1: \(x>0, y>0\) | Q2: \(x<0, y>0\)
  • Q3: \(x<0, y<0\) | Q4: \(x>0, y<0\)
Input: 10, 6
Output: 1
Input: 9, -13
Output: 4

Step-by-Step Logic

int x, y; cin >> x >> y;
if (x > 0 && y > 0) cout << 1;
else if (x < 0 && y > 0) cout << 2;
else if (x < 0 && y < 0) cout << 3;
else cout << 4;
เทคนิคเพิ่มเติม: ฝึกใช้ตัวดำเนินการ && (AND) เพื่อรวมเงื่อนไข

The Fast I/O Challenge

Problem: INTEST (SPOJ / CodeChef)

รับเลข \(n\) และ \(k\) ตามด้วยเลข \(n\) บรรทัด จงนับว่ามีเลขกี่ตัวที่หารด้วย \(k\) ลงตัว

ข้อจำกัด: \(n = 10^7\) (10 ล้านบรรทัด!) ต้องเสร็จใน 1 วินาที

Implementation: Fast I/O

ios_base::sync_with_stdio(false);
cin.tie(NULL);

// ใช้ "\n" แทน endl เพื่อลดการ Flush ข้อมูล
cout << ans << "\n";
ทำไมต้องทำ? การปิด Sync ช่วยลดเวลาจากการรอประสานงานกับไลบรารีภาษา C ทำให้ cin/cout ทำงานได้เร็วเทียบเท่า scanf/printf

เริ่มลงมือทำได้! (Lab Time)

Tips สำหรับวันนี้:

  • ✅ ลองเขียนทั้ง cin ปกติ และแบบใส่ fast_io เพื่อดูความต่างของเวลา
  • ✅ ระวังเรื่อง endl ในลูปใหญ่ๆ เพราะมันช้ามาก!
  • ✅ ใช้ long long หากเลขคำตอบเกิน \(2 \times 10^9\)

"The best way to learn is to solve."

Problem 5: FizzBuzz (Kattis: fizzbuzz)

โจทย์: รับเลข \(X, Y\) และ \(N\) ให้ไล่เลขตั้งแต่ \(1\) ถึง \(N\) โดยมีเงื่อนไข:

  • ถ้าหาร \(X\) ลงตัว ให้พิมพ์ Fizz
  • ถ้าหาร \(Y\) ลงตัว ให้พิมพ์ Buzz
  • ถ้าหารลงตัวทั้งคู่ ให้พิมพ์ FizzBuzz
  • ถ้าไม่เข้าเงื่อนไขใดเลย ให้พิมพ์เลขนั้น ๆ
Sample Input: 2 3 7
Sample Output: 1, Fizz, Buzz, Fizz, 5, FizzBuzz, 7

Step-by-Step Logic

1 ลำดับเงื่อนไข: ต้องเช็คเงื่อนไขที่ "แคบที่สุด" ก่อน คือการหารลงตัวทั้งคู่ (X และ Y) เพื่อป้องกันการข้ามเงื่อนไข
for (int i = 1; i <= n; i++) {
  if (i % x == 0 && i % y == 0) cout << "FizzBuzz\n";
  else if (i % x == 0) cout << "Fizz\n";
  else if (i % y == 0) cout << "Buzz\n";
  else cout << i << "\n";
}
Tip: การใช้ else if ช่วยให้โปรแกรมทำงานเร็วขึ้นเพราะไม่ต้องเช็คทุกเงื่อนไขถ้าเจออันที่ใช่แล้ว

Problem 6: Tarifa (Kattis: tarifa)

โจทย์: คุณมีโควตาอินเทอร์เน็ต \(X\) MB ต่อเดือน หากใช้ไม่หมดจะทบไปเดือนหน้าได้

รับค่า \(X\) และจำนวนเดือน \(N\) จากนั้นรับปริมาณการใช้งานในแต่ละเดือน \(P_i\) จงหาว่าในเดือนที่ \(N+1\) คุณจะมีอินเทอร์เน็ตให้ใช้ทั้งหมดกี่ MB

Sample Input: 10 (โควตา), 3 (เดือน)
เดือน 1-3 ใช้: 4, 6, 2
Sample Output: 28 (เหลือทบมา + โควตาเดือนใหม่)

Step-by-Step Logic

1 แนวคิด: สะสมค่าอินเทอร์เน็ตที่ "เหลือ" ในแต่ละเดือน (โควตา - ที่ใช้จริง)
int x, n, p, total = 0; cin >> x >> n;
for (int i = 0; i < n; i++) {
  cin >> p;
  total += (x - p); // บวกส่วนที่เหลือทบไป
}
cout << total + x << endl; // อย่าลืมบวกโควตาของเดือนใหม่ (N+1)
ความรู้ใหม่: การใช้ตัวแปรสะสมค่า (Accumulator) เป็นเทคนิคพื้นฐานที่สำคัญมากในการทำโจทย์

Congratulations!

วันนี้คุณได้ฝึกฝนทักษะสำคัญ:

✅ การรับส่งข้อมูลความเร็วสูง
✅ การคำนวณทางคณิตศาสตร์
✅ การใช้ลูปและการตัดสินใจ
✅ การจัดการหน่วยความจำเบื้องต้น

"ความชำนาญเกิดจากการฝึกฝนโจทย์ที่หลากหลาย"

พรุ่งนี้เตรียมพบกับ: Complexity Analysis & Binary Search!