欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

车站题解

程序员文章站 2022-07-13 13:52:26
...

这里附上题目链接:车站

							~~手动分割~~

题目

车站题解车站题解

							~~手动分割~~

因为题目并没有给出车在第二站的上下车人数,而第三站以后的所有数据都与其相关,所以我们不妨设第二站上下车人数皆为 y。又因为第一站的上车人数为 a ,所以车在每一站的上下车人数与车从每一站出发时的车载人数都可以表达为参数 a、y的多项式 ma+ny。

探索规律

以下是每一站的上下车人数与车载人数的系数表:
车站题解发现规律了吗?!

  • 对于上车人数,从第一行开始,m、n就分别构成了斐波拉数列
  • 对于下车人数,从第三行开始,m、n就分别构成了斐波拉数列
  • 对于车载人数,m [当前行]=m[上一行]+m[上车]-m[下车],n同理。

数学表示
车站题解

解法

1.(类似于)打表法

所谓从第x站出发时的车载人数实际上就是车在第x站完成上下客后的车内人数,也就是 a* total[x][0]+y* total[x][1]。

  1. 因为此题数据范围小,所以我们可以先将i=1~20的各项系数全部算出来。
  2. 直接将算好的total[x][0]与total[x][1]代入前式就行了。
  3. 当然,若给的x等于n,直接输出0.

如何算出第二站的上下车人数y???
首先我们要明白,因为车在最后一站乘客会全部下车,所以车到达最后一站时的车载人数就是车从倒数第二站出发时的人数

y=(m-a*total[n-1][0])/total[n-1][1];//计算第二站的上下车人数

AC代码:

#include <stdio.h>
#include <stdlib.h>

//设在第二站上车人数与下车人数为y
int main()
{
    int i=3,j;
    int a,m,n,x,y;
    int total[30][2]={0};//车上总人数
    int get_on[30][2]={0},get_off[30][2]={0};//get_on用于存储上车人数表达式的两个系数,get_off用于存储下车人数表达式的两个系数
    //输入数据
    scanf("%d%d%d%d",&a,&n,&m,&x);
    //初始化数组
    get_on[1][0]=1;get_on[1][1]=0;
    get_on[2][0]=0;get_on[2][1]=1;
    get_off[2][0]=0;get_off[2][1]=1;
    total[1][0]=1;total[1][1]=0;
    total[2][0]=1;total[2][1]=0;
    //计算每一站的上下车人数表达式系数与车载人数表达式的系数
    while(i<=19)
    {
        get_on[i][0]=get_on[i-1][0]+get_on[i-2][0];
        get_on[i][1]=get_on[i-1][1]+get_on[i-2][1];
        get_off[i][0]=get_on[i-1][0];
        get_off[i][1]=get_on[i-1][1];
        total[i][0]=total[i-1][0]+get_on[i][0]-get_off[i][0];
        total[i][1]=total[i-1][1]+get_on[i][1]-get_off[i][1];
        i++;
    }
    y=(m-a*total[n-1][0])/total[n-1][1];//计算第二站的上下车人数
    if(x==n)//最后一站
    {
        printf("0");
        return 0;
    }
    else
    {
        printf("%d",a*total[x][0]+y*total[x][1]);
    }
    return 0;
}

车站题解

不当之处,敬请斧正……

相关标签: 洛谷题解