洛谷 P1011 车站 题解

传送门

ROS最近开始做水题了

可能是前段时间做数论题做到推导递推式子的题做多了所以一上来做这题就推导式子然后写完代码发现样例没过。

这是怎么回事?

后来ROS发现问题出在两个数字都是符合斐波那契数列关系的,而ROS一开始推导式子的时候以为其中一个量是符合线性关系的所以出现了问题。

好的现在bug都解决了开始分析:

先写下每一站上车下车人数。

我们定义第一站上车人数为a,第二站上下车人数为ans,fib[i]表示斐波那契数列的第i项(此处假想fib[0]=0,方便计算且不会影响其正确性)

那么根据题目中所给的规律很容易得出:对于第k轮(k>=3),第k轮的下车人数总是和第k-1轮的上车人数相同。①

所以这道题变变成了一道小学六年级数学拓展题,即我们对于n-1轮有上下车的轮次并且上下车人数符合①轮次的情况中,第k站的车上的人数变不需要考虑中间轮次的上下车情况了(原理类似差分数组)。

那么我们需要考虑的便只有第n-1站和第一站上车人数以及第二站上车人数对整体的影响了!

所以可以说我们如果得到了第k轮上车人数的数量就可以得到第k轮车上的人数了。(k>=3,下面的k的范围均同此处)

顺便说一下:如果k<=2那每一轮车上的人数都应该是a。(正确性显然)

那么我们当写出每一轮上车人数时便可以发现第k轮(k>=3)上车人数便是fib[k-2]*a+fib[k-1]*ans

所以对于第k轮车上的人数我们可以知道为第k轮上车人数+第一轮上车人数-第二轮下车人数

所以第k轮车上人数为:fib[k-2]*a+fib[k-1]*ans+a-ans   ②

所以我们可以得到m=第n-1轮上车人数+第1轮上车人数-第2轮下车人数=fib[n-3]*a+fib[n-2]*ans+a-ans

所以我们移项就可以得到ans=(m-fib[n-3]*a-a)/(fib[n-2]-1)

由于右侧所有数均为已知量所以ans可求,再根据②式便可求第x轮车上的人数。

代码如下:

#include<bits/stdc++.h>
using namespace std;            //P1011车站
int a,n,m,x;
int ans;                        //第二站上下车人数
int final;                        //最终答案
int fib[25];
int main(){
    fib[2]=fib[1]=1;
    for(int i=3;i<=20;i++){
        fib[i]=fib[i-2]+fib[i-1];
    }
    scanf("%d%d%d%d",&a,&n,&m,&x);
    if(n-4>=0){
        ans=(m-fib[n-3]*a-a)/(fib[n-2]-1);
        if(x>=3){
            final=fib[x-2]*a+fib[x-1]*ans+a-ans;
        }
        else{
            final=a;
        }
    }
    else{
        final=a;
    }
    printf("%d",final);
    return 0;
}

(最后吐槽一下:这道题某谷评分为普及-但是说实话如果这道题是一道纯推导题的话我感觉给他一个普及的名分也是可以的。可惜可能是我做题总是想不到更简单的方法只会直接推导,比如——打表<这道题某谷题解里居然有人打表做呀我真的无语了>)

还有就是这题某谷上的数据只有四个数据点我一开始写的代码有一处不完善的地方居然也给我AC了。这数据也太水了吧。

posted @ 2020-03-29 21:09  Robertspot  阅读(211)  评论(0编辑  收藏  举报