กำหนดตัวเลขสามตัว 'a', 'b' และ 'c' เป็นอินพุต เป้าหมายคือหาจำนวน/ค่าของ 'a', 'b' และ 'c' หลังจาก n วินาที โดยที่อัตราการสืบพันธุ์คือ:-
- ทุก a จะกลายเป็น b ทุกๆ 2 วินาที
- ทุก b จะกลายเป็น c ทุกๆ 5 วินาที
- ทุก c จะกลายเป็น 2 a ทุกๆ 12 วินาที
ทำความเข้าใจด้วยตัวอย่าง
ตัวอย่าง
Input - n_seconds = 62, a = 1, b = 1, c = 1
Output - จำนวน a หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 0
จำนวน b หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 33
จำนวน c หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 1
คำอธิบาย - หลังจาก 60 วินาที a จะเป็น 32, b = 0, c = 0
หลังจากอีก 2 วินาที ทุก b จะกลายเป็น c, c = 1 ทุก a กลายเป็น b, b = 33
Input - n_seconds = 20, a = 1, b = 1, c = 1
Output - จำนวน a หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 0
จำนวน b หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 0
จำนวน c หลัง n วินาทีตามอัตราการสืบพันธุ์คือ: 6
คำอธิบาย
1 วินาที: a=1, b=1, c=1
2 วินาที: a=0, b=2(1+1), c=1 → a กลายเป็น b หลัง 2 วินาที
4 วินาที: a=0, b=2, c=1 → a กลายเป็น b หลัง 2 วินาที
5 วินาที: a=0, b=0, c=3(1+2) → b กลายเป็น c หลัง 5 วินาที
6 วินาที: a=0, b=0, c=3 → a กลายเป็น b หลัง 2 วินาที
8 วินาที: a=0, b=0, c=3 → a กลายเป็น b หลัง 2 วินาที
10 วินาที: a=0, b=0, c=3 → b กลายเป็น c หลัง 5 วินาที
12 วินาที: a=6(0+2*3), b=0, c=0 → c กลายเป็น 2a หลัง 12 วินาที
14 วินาที: a=0, b=6(0+6), c=0 → a กลายเป็น b หลัง 2 วินาที
15 วินาที: a=0, b=0, c=6(0+6) → b กลายเป็น c หลัง 5 วินาที
16 วินาที: a=0, b=0, c=6 → a กลายเป็น b หลัง 2 วินาที
18 วินาที: a=0, b=0, c=6 → a กลายเป็น b หลัง 2 วินาที
20 วินาที: a=0, b=0, c=6 → b กลายเป็น c หลัง 5 วินาที
แนวทางที่ใช้ในโปรแกรมด้านล่าง
LCM ของวินาทีจะเป็น 60 (2, 5, 12) ดังนั้นการเปลี่ยนแปลงของ a, b และ c หลังจากทุกๆ 60 วินาทีจะเป็น:
60 วินาที → a = 32, b = 0, c = 0
120 วินาที → a = 32*32, b = 0, c = 0
180 วินาที → a = 32*32*32, b = 0, c = 0
สำหรับวินาทีที่เป็นพหุคูณของ 60 คำนวณ a ตามข้างต้น สำหรับที่ไม่ใช่พหุคูณ คำนวณพหุคูณที่ใกล้ที่สุด temp แล้ววนจาก temp+1 ถึงวินาทีอินพุตและคำนวณโดยใช้ mod 2, 5 หรือ 12
- รับตัวเลข a, b และ c เป็นอินพุต
- รับ n_seconds เป็นเวลาในวินาที
- ฟังก์ชัน reproduction_rate(int n_seconds, int a, int b, int c) รับพารามิเตอร์ทั้งหมดและพิมพ์จำนวน a, b และ c หลัง n วินาทีตามอัตราการสืบพันธุ์
- รับ temp = n_seconds / 60 เป็นพหุคูณของ 60 ที่น้อยกว่า n_seconds
- คำนวณ a = (int)pow(32, temp) ตามสูตร (a^temp)
- อัปเดต temp = 60 * temp สำหรับพหุคูณของ 60 ที่ใกล้ที่สุดน้อยกว่าหรือเท่ากับ n_seconds
- ตอนนี้วนลูป for จาก i = temp+1 ถึง i = n_seconds
- ถ้าตัวเลข i เป็นพหุคูณของ 2 อัปเดต b โดยบวก a และตั้ง a = 0
- ถ้าตัวเลข i เป็นพหุคูณของ 5 อัปเดต c โดยบวก b และตั้ง b = 0
- ถ้าตัวเลข i เป็นพหุคูณของ 12 อัปเดต a โดยบวก 2c และตั้ง c = 0
- ในท้ายที่สุดของ for loop พิมพ์ค่าสุดท้ายของ a, b และ c
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void reproduction_rate(int n_seconds, int a, int b, int c) {
int temp = n_seconds / 60;
a = (int) pow(32, temp);
temp = 60 * temp;
for (int i = temp + 1; i <= n_seconds; i++) {
if (i % 2 == 0) {
b = b + a;
a = 0;
}
if (i % 5 == 0) {
c = c + b;
b = 0;
}
if (i % 12 == 0) {
a = a + (2 * c);
c = 0;
}
}
cout << "Count of a after n seconds for given reproduction rate is: " << a << "\n";
cout << "Count of b after n seconds for given reproduction rate is: " << b << "\n";
cout << "Count of c after n seconds for given reproduction rate is: " << c;
}
int main() {
int n_seconds = 72;
int a = 2;
int b = 1;
int c = 1;
reproduction_rate(n_seconds, a, b, c);
return 0;
}
หากเรารันโค้ดข้างต้น จะได้ผลลัพธ์ดังนี้
ผลลัพธ์
Count of a after n seconds for given reproduction rate is: 68 Count of b after n seconds for given reproduction rate is: 0 Count of c after n seconds for given reproduction rate is: 0