其实核心就是第二站的人数,因为题目没说第二站上车多少人、下车多少人,但是肯定有人上车上车、下车,于是就用一个循环,从1个人开始遍历,看看到底循环变量到几(也就是第二站上车、下车多少人)才满足第n-1站人数等于m人。还需要注意一点的就是第n-1站人数就已经确定了,最后一站全部人员下车,不存在新的上车人,详细代码如下:

参考代码:

#include <stdio.h>
#include <math.h>

int main() {
    int a = 0, n = 0, m = 0, x = 0;
    scanf("%d %d %d %d", &a, &n, &m, &x);
    int siteNumber[n+1];//每一站车上的人数,第0站丢弃不用,从第1站开始,每一个数据元素存储到达该站时汽车上的人数
    siteNumber[0] = 0;//第0号元素丢弃不用
    siteNumber[1] = siteNumber[2] = a;//第1站和第2站车上都是a人

    int onPerson[n+1];//每一站的上车人数
    onPerson[0] = 0;//同样将第0号元素丢弃不用
    onPerson[1] = a;//第一站上了a人

    int downPerson[n+1];//每一站的下车人数
    downPerson[0] = 0;//同样将第0号元素丢弃不用
    downPerson[1] = 0;//第1站只有人上车,没有人下车

    for (int i = 1; i < n+1; ++i) {
        /*
         * 既然第二站没说上车、下车多少人,不妨就从1个人开始循环遍历,
         * 看看第二站到底上多少人才能满足n-1站是m个人,
         * 注意最后一站是只下人,不上人,在第n-1站时就已经达到了m人
         * */
        onPerson[2] = i;
        downPerson[2] = i;

        //从第三站开始符合规律,即每一站上车人数等于前两站上车人数,下车人数等于上一站上车人数
        for (int j = 3; j <= n-1; ++j) {
            onPerson[j] = onPerson[j-1]+onPerson[j-2];
            downPerson[j] = onPerson[j-1];

            //计算当前车里的总人数 = 前一站车子上的人数+本站上车人数-本站下车人数
            siteNumber[j] = siteNumber[j-1]+onPerson[j]-downPerson[j];
        }

        //如果第n-1站的人数等于m,那就结束循环,同时输出第x站的人数
        if (siteNumber[n-1] == m) {
            printf("%d", siteNumber[x]);
            break;
        }

    }


}


点赞(0)
 

0.0分

9 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论