关注我们
今天给大家带来一份优秀题解(题号:1179):
解题思路
1
设共n=7个站,第一站上车a=5人,最后一站下车32人,设第二站上车人数为x(其下车人数等于上车人数)
2.罗列
①:第一站上车人数为:0*x+5,此时共有5人 (为了好求x,以及便于理解故写作0*x+5)
②:第二站上车人数为:1*x+0,下车x人 此时共有5人
③:第三站上车人数为:1*x+5,下车人数为x ,此时共有5+ (5) =10人
④:第四站上车人数为:2*x+5,下车人数为x+5,此时共有10+ (x) =10+x
⑤:第五站上车人数为:3*x+10,下车人数为2*x+5,此时共有10+x+ (x+5) =15+2*x
⑥:第六站上车人数为:5*x+15,下车人数为3*x+10,此时共有15+2*x+ (2*x+5) =20+4*x==32
红色的系数存入A[ ],蓝色的数存入B[ ]
(第七站全下车32人,故x=3)
⑦:第七站上车人数为:8*x+25,下车人数为5*x+15,此时共有20+4*x+ (3*x+10) =30+7*x
⑧:第八站上车人数为:13*x+40,下车人数为8*x+25,此时共有30+7*x+ (5*x+15) =
3.规律
①:第一站,第二站车上人数为a=5,从第三站开始,包括第三站,每站的人数等余,上车前人数加上上上一站的上车人数。 比如第四站车上人数等于:(5)+ (0*x+5)+ (1*x+0) =10+x即:a+第一站上车人数+第二站上车人数
同理第六站车上人数等于:(5)+ (0*x+5)+ (1*x+0)+(1*x+5)+(2*x+5)=20+4*x==32
即:a+第一站上车人数+第二站上车人数+第三站上车人数+第四站上车人数 (只加到六减二站)
4.
根据规律以及A[ ],B[ ] ,以第六站为例:20+4*x==32
其中20= 5+5+0+5+5= a+B[0]+B[1]+B[2]+[3]
其中4= 0+1+1+2=A[0]+A[1]+A[2]+A[3]
令bb代表B[0]+B[1]+B[2]+[3] ,aa代表A[0]+A[1]+A[2]+A[3]
求出bb,aa 就可以求出x
知道x后,就可以根据以上罗列求出,每一站的上车人数,下车人数,以及车上人数;
注意
(以上所有x不是题目中第几站x,它是第二站上下车人数)
参考代码:
#include<stdio.h>
#include<malloc.h>
void qiu_A(int *A,int n); //求A[]
void qiu_B(int *B,int n,int a);//求B[]
void fun_ction(int *A,int *B,int a,int n,int x,int m); //求X第二站上下车人数
void output_up(int *A,int *B,int a,int n,int x,int m,int X);//输出上车人数
void output_down(int *A,int *B,int a,int n,int x,int m,int X);//输出下车人数
void output_left(int *A,int *B,int a,int n,int x,int m,int X);//输出车上人数
/*=====================================================================*/
int main()
{
int a,n,m,x;
while(scanf("%d%d%d%d",&a,&n,&m,&x)!=EOF)
{
int *A=(int *)malloc((n-1)*sizeof(int));
int *B=(int *)malloc((n-1)*sizeof(int));
qiu_A(A,n); //求A[]
qiu_B(B,n,a);//求B[]
fun_ction(A,B,a,n,x,m);
}
return 0;
}
/*=====================================================================*/
void qiu_A(int *A,int n)
{
A[0]=0;
A[1]=1;
for(int i=2;i<n-1;i++)
A[i]=A[i-1]+A[i-2];
}
/*=====================================================================*/
void qiu_B(int *B,int n,int a)
{
B[0]=a;
B[1]=0;
for(int i=2;i<n-1;i++)
B[i]=B[i-1]+B[i-2];
}
/*=====================================================================*/
void fun_ction(int *A,int *B,int a,int n,int x,int m)
{
int aa=0,bb=0;
for(int i=0;i<n-3;i++)
{
aa+=A[i];
bb+=B[i];
}
int X=(m-a-bb)/aa; //据上述规律求X(第二站上下车人数)
//printf("X=%d\n",X);
//output_up(A,B,a,n,x,m,X); //输出第x站上车人数
//output_down(A,B,a,n,x,m,X);//输出第x站下车人数
output_left(A,B,a,n,x,m,X); //输出第x站车上人数
}
/*=====================================================================*/
void output_up(int *A,int *B,int a,int n,int x,int m,int X)
{
printf("up==%d\n",A[x-1]*X+B[x-1]);
return ;
}
/*=====================================================================*/
void output_down(int *A,int *B,int a,int n,int x,int m,int X)
{
if(x==1) //第一站无人下车
printf("no one get off\n");
else
if(x==2) //第二站上下车人数相等,且等于X
printf("down==%d\n",X);
else
printf("down==%d\n",A[x-2]*X+B[x-2]); //上一站上车人数
return ;
}
/*=====================================================================*/
void output_left(int *A,int *B,int a,int n,int x,int m,int X)
{
int aa=0,bb=0;
for(int i=0;i<x-2;i++)
{
aa+=A[i];
bb+=B[i];
}
printf("%d\n",a+aa*X+bb);
return ;
}