解题思路:
从第二站开始,就需要知道上车人数,由题目得知:第二站一定有人上下车,由于上一站上了a个人,那么第二站最多下车人数是a,由于第二站的下车人数与上车人数相等,那么第二站上车人数的范围应该在1到a之间,后续每一站上下车的人数都可递推得出,同时记录车开走时车上的人数,若到第n站时人数等于m,递推成功,输出结果。

注意事项:
车从最后一站开走时,人全都下车后,车上人数为0。

参考代码:

#include<stdio.h>
#include<stdlib.h>
int main(){
	int i,a,n,m,x,s,*sc,*xc,*r;
	scanf("%d%d%d%d",&a,&n,&m,&x);
	sc=(int *)malloc((n+1)*sizeof(int));
	xc=(int *)malloc((n+1)*sizeof(int));
	r=(int *)malloc((n+1)*sizeof(int));
	sc[1]=a;//第一站上车人数
	xc[1]=0;//第一站下车人数
	r[1]=a; //从第一站开走时车上人数
	for(sc[2]=1;sc[2]<=a;sc[2]++){//从1到a假设第二站上车人数
		s=a;
		xc[2]=sc[2];//第二站下车人数
		s+=sc[2];
		s-=xc[2];
		r[2]=s;//从第二站开走时车上人数
		for(i=3;i<n;i++){
			sc[i]=sc[i-1]+sc[i-2];//第i站上车人数
			xc[i]=sc[i-1];//第i站下车人数
			s+=sc[i];
			s-=xc[i];
			r[i]=s;//从第i站开走时车上人数
		}
		r[i]=0;
		if(s==m) break;//到第n站时车上人数是否为m
	}
	printf("%d\n",r[x]);
	if(NULL!=sc) free(sc);
	if(NULL!=xc) free(xc);
	if(NULL!=r) free(r);
	return 0;
}
点赞(2)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论