16日模拟
作者:互联网
7、火车站(Noip1998) 【问题描述】
火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前) 车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定的规律:上车的 人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 n-1 站),都满足此规律。现给出的条件是:共有 N 个车站,始发站上车的人数为 a,最后一 站下车的人数是 m(全部下车)。试问从 x 站开出时车上的人数是多少?
【输入格式】a,n,m 和 x
【输出格式】x 站开出时车上的人数
【输入样例】
1 6 7 3
【输出样例】
2
这道题是一个递推,先设第2站上车的人数是t,然后一层一层推,他最后一站下车的人数就是他倒数第二站车里的总人数,然后可以发现总人数从第四站开始,a和t的系数呈斐波那契数列式的递增,而且t的递增比a快一级,那么思路就很明显了,先把斐波那契存起来放着,然后利用递推分别求出系数,倒数第二站的人数等于m,通过这个等式可以求出t,进而求出第x站的人,出思路不难,对我来说难的是把这些东西有机地结合起来(代码能力太弱),话不多说,上代码——
#include
#include
using namespace std;
long int a,n,m,x;
int main()
{
scanf("%d %d %d %d" ,&a,&n,&m,&x);
if(x == 3){
printf("%d" ,2 * a);
return 0;
}
int b[10001] = { },axs[10001] = { },txs2[10001] = { }; //存系数
axs[4] = 2; //赋初值
txs2[4] = 1;
b[1] = 1;
b[2] = 1;
int xs = 0;
int txs = 0;
if(n == 5){
int j = (m - 2 * a) ;
printf("%d" ,j + 2 * a);
return 0;
}
for(int i = 3;i <= n - 1; i++){//斐波那契
b[i] = b[i - 1] + b[i - 2];
}
for(int i = 5;i <= n - 1; i++){//计算系数
axs[i] = axs[i - 1] + b[i - 4];
}
for(int i = 5;i <= n; i++){
txs2[i] = txs2[i - 1] + b[i - 3];
}
int t;
int h = 0;
h = a * axs[n - 1];
t = (m - h) / txs2[n - 1];
int fin;
fin = a * axs[x] + t * txs2[x];
printf("%d" ,fin);
return 0;
}
标签:axs,下车,16,int,txs2,上车,人数,模拟 来源: https://blog.csdn.net/Skywalker_____/article/details/112756479