Manchester


私信TA

用户名:wenyajie

访问量:313223

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62797
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
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 ;
}

别忘点赞哦-.-



 

0.0分

5 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

做复杂了吧,我觉得用结构体更简单点
2018-04-03 17:37:16
  • «
  • 1
  • »