【題解】ZeroJudge a830: 超級細菌( bacteria )

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=a830
【解題想法】DP

  • 此系統假設實驗一開始有M個成熟的超級細菌及N個新生的超級細菌
  • 一個新生的超級細菌a必須經過X+Y分鐘後才能第一次繁衍新生的超級細菌a
    • 經過X分鐘後,長成為成熟超級細菌a。
    • 再經過Y分鐘後,才能第一次開始繁衍新生的超級細菌a。
  • newN[i]: 第 i 天新增的新生超級細菌數目。第 i – Y, i – 2Y …天的成熟超級細菌數目總和,乘以 Z。
  • newM[i]: 第 i 天新增的成熟超級細菌數目。等於第 i – X 天的新生超級細菌數目。
  • 「新生」超級細菌一旦變成「成熟」超級細菌,要從新生超級細菌數目被扣除。
#include <iostream>
using namespace std;
const int maxn = 105;
int newM[maxn];
int newN[maxn];

int main() {
    int M, N, W, X, Y, Z;
    cin >> M >> N >> W >> X >> Y >> Z;
    int sumM = M;
    int sumN = N;
    newM[0] = M;
    newN[0] = N;
    for (int i=1; i<=W; i++){
        int tmp = 0;
        for (int j=i-Y; j>=0; j-=Y){
            tmp += newM[j];
        }
        newN[i] = tmp * Z;
        sumN += newN[i];
        if (i - X >= 0){
            newM[i] = newN[i-X];
            sumM += newM[i];
            sumN -= newN[i-X];
            newN[i-X] = 0;
        }
    }
    cout << sumN + sumM << "\n";
    return 0;
}

Python code (credit: Amy Chou)

M, N, W, X, Y, Z = map(int, input().split())

sumM = M
sumN = N
newM = [M] + [0 for _ in range(W)]
newN = [N] + [0 for _ in range(W)]
for i in range(1, W+1):
    tmp = 0
    for j in range(i-Y, -1, -Y):
        tmp += newM[j]

    newN[i] = tmp * Z
    sumN += newN[i]
    if i - X >= 0:
        newM[i] = newN[i - X]
        sumM += newM[i]
        sumN -= newN[i - X]
        newN[i - X] = 0

print(sumN + sumM)
分享本文 Share with friends