m0_73827703 2023-12-25 19:40 采纳率: 75%
浏览 22
已结题

C语言知道秘密的人数leetcode变式

在第 1 天,有一个人感染了新冠。给定整数 spread,表示每个被感染的人在感染后的 spread 天之后,每天将病毒传播给一个新的人。同时给定整数 recover,表示每个被感染的人在感染后 recover 天之后会康复,不再传播病毒。一个人在康复后的那一天及之后的日子里拥有抗体不再传播病毒。
给你一个整数 n,请你返回在第 n 天结束时,被感染的人数。
由于答案可能会很大,请你将结果对10^9+7取余后返回。
要求必须使用C语言完成。
要求输入和输出格式严格按照所给要求,并且提供完整代码,谢谢。

img

  • 写回答

10条回答 默认 最新

  • 吃不了席 2023-12-25 19:57
    关注

    引自微信小程序:皆我百晓生

    问题的关键在于理解感染和康复的过程,以及每天感染和康复的人数。

    首先,可以使用两个数组分别表示每一天感染和康复的人数。假设第一天有一个人感染了新冠,那么第一天感染的人数就是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的值来测试代码。运行结果将输出被感染的人数。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月28日
  • 修改了问题 12月25日
  • 创建了问题 12月25日