ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Fibonacci思想的灵活应用(洛谷P1011题题解,Java语言描述)

2020-01-24 12:06:20  阅读:260  来源: 互联网

标签:洛谷 temp 题解 sum P1011 up next Fibonacci first


题目要求

P1011题目链接
在这里插入图片描述

分析

这题我思考了很久,终于在今天有了比较明确的思路,讲一下吧。

我们先做个表格(手动的,这里为了展示就用Word重做了一个):
在这里插入图片描述

这题标签里有Fibonacci,那么与Fibonacci的关联是什么呢?
我们观察表格和理解题意,可以发现,每次上车人数是前两次上车人数的和(上车人数数列类似于Fibonacci数列),下车人数是上一次的上车人数,这就是关系。
不是说一定要套Fibonacci数列才是考察了Fibonacci数列呀!

初次读题,可能有些困惑,觉得这第二站上车人数有用吗?或者会默认为上车a下车a,这样的话你随便代代测试数据就会知道自己错啦,错在哪里?
其实第二次上下车的人是y,即另一个未知量,我们应该单独为了处理它大动干戈,理解到这个份上,你才能自己做出上面的表格,才能有设计算法的思路。

设计的话,我想的也比较简单粗暴,开循环迭代求解出ai的数值,再求出y的系数,用最终下车的m减去ai,再除以y的系数就得到了y,有了y,就可以重新再跑一遍得到x时的ai和yi,相加即是答案。

值得一提的是由于最后一次是有出无进,所以所谓的最后一次下车人数其实是上一次(n-1站)的剩余人数;但最终的第x站,只要不是最后一站,就可以取到本站,而不是上一站。这是特别重要的,当然我没有做第x站是不是最后一站的特判,测试数据也没有,建议大家更细致一些吧!

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //出发人数、站数、抵终人数、待求站号
        int a = scanner.nextInt(), n = scanner.nextInt(), m = scanner.nextInt(), x = scanner.nextInt();
        scanner.close();
        //先算a
        long first_up = a, next_up = 0, sum_a = a, sum_y_num = 0, y = 0, temp_up = 0, temp_down = 0, x_a = a, x_y = 0;
        for (int i = 3; i < n; i++) {
            temp_up = first_up + next_up;
            temp_down = next_up;
            first_up = next_up;
            next_up = temp_up;
            sum_a += (temp_up-temp_down);
        }
        //算y
        first_up = 0;
        next_up = 1;
        for (int i = 3; i < n; i++) {
            temp_up = first_up + next_up;
            temp_down = next_up;
            first_up = next_up;
            next_up = temp_up;
            sum_y_num += (temp_up-temp_down);
        }
        y = (m-sum_a)/sum_y_num;
        first_up = a;
        next_up = 0;
        for (int i = 3; i <= x; i++) {
            temp_up = first_up + next_up;
            temp_down = next_up;
            first_up = next_up;
            next_up = temp_up;
            x_a += (temp_up-temp_down);
        }
        first_up = 0;
        next_up = y;
        for (int i = 3; i <= x; i++) {
            temp_up = first_up + next_up;
            temp_down = next_up;
            first_up = next_up;
            next_up = temp_up;
            x_y += (temp_up-temp_down);
        }
        System.out.println(x_a+x_y);
    }
}

在这里插入图片描述

进阶的JFarmer 发布了358 篇原创文章 · 获赞 616 · 访问量 3万+ 私信 关注

标签:洛谷,temp,题解,sum,P1011,up,next,Fibonacci,first
来源: https://blog.csdn.net/weixin_43896318/article/details/104079789

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有