洛谷P1011 [NOIP1998 提高组] 车站题解

2023-11-16

斐波那契数列

题目描述

火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第(n−1)站),都满足此规律。现给出的条件是:共有n个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
对于全部的测试点,保证1≤ a ≤20,1≤ x ≤n ≤20,1 ≤ m ≤ 2×104

输入格式

输入只有一行四个整数,分别表示始发站上车人数 a ,车站数 n ,终点站下车人数 m 和所求的站点编号 x 。

5 7 32 4

输出格式

输出一行一个整数表示答案:从 x 站开出时车上的人数。

整体思路

我们不妨先来列一个表格,a 代表始发站人数,t 代表第二站上车人数。

上车人数 下车人数 车上增加人数 出站时人数
1 a \ a a
2 t t 0 a
3 1a+1t 0a+1t 1a+0t 2a
4 1a+2t 1a+1t 0a+1t 2a+t
5 2a+3t 1a+2t 1a+1t 3a+2t
6 3a+5t 2a+3t 1a+2t 4a+4t
7 5a+8t 3a+5t 2a+3t 6a+7t
8 8a+13t 5a+8t 3a+5t 9a+12t
9 13a+21t 8a+13t 5a+8t 14a+20t

······

我们不难发现,除了“出站时人数”这一列,其他几列都有数据符合斐波那契数列的规律(即第i项等于第i-1项+第i-2项),可以很轻松的用循环求出任意一列的 a , t 系数。

因为数据 n 最大只有20,我们可以把 1~n 站火车出站时的人数都用始发站人数 a 和第2站上车人数 t 表示出来。

蒟个栗子

拿样例来说:

始发站为5人,共有7站,结束时32人下车,求第4站驶出时人数。

(注意:总站数是7站,32人下车,所以第6站驶出时为32人。)

看到上面表格,第6站驶出时人数为 4a+4t ,所以:

4×5+4×t = 32

可以很轻松算出t=3。

再看第4站驶出时人数,为2a+t,所以:

2×5+3 = 13

最终得到的结果就是13。

这样除去数据预处理的时间,该解决方式的时间复杂的只有O(n).

代码实现看这里

#include<iostream>
using namespace std;
int a,n,m,x,t;
int Fibo[25];
struct train{//为了看上去明白就用了结构体,其实用二维数组或两个一维数组就行了
    int a,t;//存储每一站火车出站时人数a和t的系数
}sum[25];
void pre()
{
    Fibo[1]=1;
    Fibo[2]=1;
    for(int i=3;i<=n;i++)//求斐波那契数列
        Fibo[i]=Fibo[i-1]+Fibo[i-2];
    sum[1].a=1;//根据表格初始化值
    sum[2].a=1;
    sum[3].a=2;
    for(int i=4;i<=n;i++)//根据表格规律计算a和t的系数
    {
        sum[i].a+=Fibo[i-4]+sum[i-1].a;
        sum[i].t+=Fibo[i-3]+sum[i-1].t;
    }
    return ;
}
void solve()
{
    t=(m-sum[n-1].a*a)/sum[n-1].t;//计算t的值(注意是终点站前一站)
    cout<<sum[x].a*a+sum[x].t*t<<endl;//输出第x站火车出站时人数
    return ;
}
int main()
{
    cin>>a>>n>>m>>x;//读入始发站人数,总车站数,n-1站火车出站时人数
    pre();//预处理
    solve();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷P1011 [NOIP1998 提高组] 车站题解 的相关文章

随机推荐

  • vue3:el-table多选框设置默认选中,翻页保留选中状态

    问题 el table多选框设置默认选中 进行翻页 之前选中的数据没有保留选中状态
  • 设计模式-模板方法模式

    一 模板方法模式 定义 定义一个操作中的算法骨架 而将一些步骤延迟到子类 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 类型 行为型模式 特点 通过把不变的行为搬移到超类 去除子类中的重复代码来体现它的优势 提供了
  • 【4】数据结构与算法--- 数据结构 进阶

    第 3 章 数据结构 进阶 3 1 线性表 线性表 按照某种线性关系存储下来的表 分类 线性表 说明 顺序表 将数据放在一个连续的存储空间 链表 把数据分散存储 按照某种关系连成串分类 单向链表 双向链表 单向循环链表 3 2 顺序表 3
  • python怎么一次输入两个数_python如何一次性输入多个数

    python一次性输入多个数的方法 1 输入两个数字 m n map int input split 2 输入三个及三个以上数字 a b c d map int input split python一次性输入多个数的方法 1 输入一个数字直
  • 在NLP上,CNN、RNN、MLP三者相比各有何优劣

    本文为知乎温颖就如下问题的回答 已授权CSDN转载 若想要实现某个具体的任务 如做关系抽取 实体识别 情感分类等 在不考虑实现的难度的情况下 如何从理论 经验 直觉上去选择最有希望的模型 前段时间做过用不同的神经网络模型做文本分类 情感分析
  • Linux(vi基本用法)

    在Linux下 可以键入vimtutor命令 有一个包含实操的vim教程 1 VI的三种命令模式 1 Command 命令 模式 用于输入命令 2 Insert 插入 模式 用于插入文本 3 Visual 可视 模式 用于视化的的高亮并选定
  • 报错:flask: TypeError: ‘function‘ object is not iterable

    错误 TypeError function object is not iterable Type错误 表示 函数 对象不是可迭代的 这是我在学习flask时在html模板中 进行for循环遍历闪现消息时缺少 导致遍历对象为一个函数 报错代
  • tomcat虚拟目录和虚拟主机等相关配置

    一 WEB 服务器 1 什么是WEB 服务器 就是一台电脑 安装了一个服务器软件 2 为什么需要安装 WEB 服务器 思考问题 从一台计算机的 IE 浏览器如何去访问另一台计算机中的文件 2 1 两台计算机是如何实现通讯的 IP地址 计算机
  • mesa 教程

    只有这个是靠谱的 Compiling and Installing The Mesa 3D Graphics Library latest documentation
  • yolov4训练自己的数据模型

    看了下yolov4的作者给的操作说明 链接如下 https github com AlexeyAB darknet how to compile on linux using make 有兴趣的可以去看看 总结起来 跟yolov3的操作方式
  • SpringCloud 商城系统搭建之Hystrix(基于Feign)

    前提 1 Feign在整合到Spring Cloud时已经自带了hystrix模块 所以pom xml中不需要额外引入feign依赖 2 本文是基于SpringCloud 商城系统搭建之eureka 一 基于Feign使用熔断器 按照下面步
  • H.264概述

    我的百科 我的贡献 草稿箱 百度首页 登录 新闻 网页 贴吧 知道 MP3 图片 视频 百科 帮助设置 添加到搜藏 返回百度百科首页 编辑词条 H 264
  • STM32控制L298n(从零开始)

    一 L298N模块简介 L298N是一款驱动模块 单片机通过向IN1 IN2 IN3 IN4输入PWM波从而控制OUT1 OUT2 ENA与ENB为使能引脚 使能引脚两根排针一定要短接 12v为模块供电 5v为单片机供电 二 L298N的逻
  • 什么是CentOS

    什么是CentOS CentOS是Community ENTerprise Operating System的简称 我们有很多人叫它社区企业操作系统 不管你怎么叫它 它都是linux的一个发行版本 CentOS并不是全新的linux发行版
  • MySQL密码忘记了怎么办?

    MySQL密码忘记了怎么办 本文就介绍了如何用canvas案例画出哆啦A梦的基础内容 提示 以下是本篇文章正文内容 下面案例可供参考 一 1 打开cmd命令符 先关闭正在运行的数据库 输入如下命令 二 打开mysql exe和mysqld
  • VUE的核心特性:响应式

  • 【Pytorch Lighting】第 6 章:深度生成模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • openEuler和linux什么关系,华为openEuler和鸿蒙(HarmonyOS)不是同一个操作系统

    华为推出了新操作系统 定名为openEuler 当前已提供20 03版本下载 有人不解的问 它跟鸿蒙 HarmonyOS 是不是同一个操作系统 或者有什么关系 华为openEuler和鸿蒙 HarmonyOS 100 不是同一个操作系统 并
  • string类型数组java_Java string类和数组的相关函数总结

    一 string类 1 字符串查找 1 str indexOf substr 返回substr首次在str里出现的索引 str 任意字符串对象 substr 要搜索的字符串 2 str lastIndexOf substr 返回substr
  • 洛谷P1011 [NOIP1998 提高组] 车站题解

    斐波那契数列 题目描述 火车从始发站 称为第1站 开出 在始发站上车的人数为a 然后到达第2站 在第2站有人上 下车 但上 下车的人数相同 因此在第2站开出时 即在到达第3站之前 车上的人数保持为a人 从第3站起 包括第3站 上 下车的人数