Codeforce Round#274 :Riding in a Lift解题报告

博客详细解析了Codeforce Round#274中关于Riding in a Lift的问题,包括问题描述、输入输出格式、解题思路和关键的动态规划算法。博主给出了如何通过动态规划计算可能到达各层的序列数,并优化存储空间,最终求解不同序列数的模1000000007的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

有n层电梯,标记为整数1...n,现在处于第a层,第b层有秘密实验室不能进入(a != b).

现连续乘坐k轮电梯,若某次在x层,乘坐电梯后到达y层,则y满足 |x - y| < |x - b|,每到达一层记录层序号,k轮后即得到一个整数序列。求可能得到的不能序列数。


输入:

四个整数: nabk (2 ≤ n ≤ 50001 ≤ k ≤ 50001 ≤ a, b ≤ na ≠ b)


输出:

一个整数:不同序列数(mod 1000000007)


解题思路:

设 f[i][j]表示前i轮可能到达第j层的序列数。

设s[i][j]记录第i轮前j层可能达到序列总数,即s[i][j] = f[i][j]+s[i][j-1];

由题意知,可能到达第j层的层数x满足:

若j<b 则 x<(j+b)/2,即x<=(j+b-1)/2 且x!=j。f[i][j] = s[i-1][(j+b-1)/2]-f[i-1][j];

若j>b 则 x>(j+b)/2且x!=j。f[i][j] = s[i-1][n]-s[i-1][(j+b)/2]-f[i-1][j];

可知,s[k][n]即为所需解。

由于每次运算只需前一轮信息,故,f,g数组只用一维即可。


代码如下:

#include <stdio.h>
#define mod 1000000007

int n, a, b, k;
int f[5005] = { 0 }, s[5005] = { 0 };

int main()
{
	scanf("%d%d%d%d", &n, &a, &b, &k);
	f[a] = 1;
	for (int i = 1; i <= n; i++) s[i] = s[i - 1] + f[i];
	for (int i = 1; i <= k; i ++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (j < b) f[j] = (s[(j + b - 1) / 2] - f[j] + mod ) % mod;
			if (j > b) f[j] = ((s[n] - s[(j + b) / 2] + mod) % mod - f[j] + mod) % mod;
		}

		for (int j = 1; j <= n; j++) s[j] = (s[j - 1] + f[j]) % mod;
	}
	printf("%d\n", s[n]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值