引自微信小程序:皆我百晓生:
问题的关键在于理解感染和康复的过程,以及每天感染和康复的人数。
首先,可以使用两个数组分别表示每一天感染和康复的人数。假设第一天有一个人感染了新冠,那么第一天感染的人数就是1,康复的人数是0。第二天开始,感染的人数等于前一天感染的人数加上前spread天康复的人数,康复的人数等于前一天康复的人数加上前recover天感染的人数。具体的计算公式如下:
infected[i] = infected[i-1] + recovered[i-recover]
recovered[i] = recovered[i-1] + infected[i-spread]
然后,我们需要在第n天结束时计算被感染的人数。由于答案可能会很大,我们需要对结果进行取余操作。最后的结果就是第n天感染的人数。
下面是完整的C语言代码:
#include <stdio.h>
#define MOD (1000000007)
int infected[1001];
int recovered[1001];
int getInfectedPeople(int n, int spread, int recover) {
// 第一天感染的人数是1
infected[1] = 1;
for (int i = 2; i <= n; i++) {
// 计算第i天感染的人数
infected[i] = (infected[i-1] + recovered[i-recover]) % MOD;
// 计算第i天康复的人数
recovered[i] = (recovered[i-1] + infected[i-spread]) % MOD;
}
return infected[n];
}
int main() {
int n = 6;
int spread = 2;
int recover = 4;
int result = getInfectedPeople(n, spread, recover);
printf("%d\n", result);
return 0;
}
在主函数中,我们可以自定义n,spread和recover的值来测试代码。运行结果将输出被感染的人数。