蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】

这篇具有很好参考价值的文章主要介绍了蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 点击跳转专栏=>Unity3D特效百例
  • 点击跳转专栏=>案例项目实战源码
  • 点击跳转专栏=>游戏脚本-辅助自动化
  • 点击跳转专栏=>Android控件全解手册
  • 点击跳转专栏=>Scratch编程案例
  • 点击跳转=>软考全系列
  • 点击跳转=>蓝桥系列

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,获取更多支持,交流让学习不再孤单

蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】

👉实践过程

需要所有整理的文档可底部卡片联系我,直接发压缩包。

😜地宫取宝

问题描述
  X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。

地宫的入口在左上角,出口在右下角。

小明被带到地宫的入口,国王要求他只能向右或向下行走。

走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。

请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入格式
  输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
输出格式
  要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 2 2
1 2
2 1
样例输出
2
样例输入
2 3 2
1 2 3
2 1 5
样例输出
14

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class Main
{
	private static StreamTokenizer tokenizer = new StreamTokenizer(
			new InputStreamReader(System.in));
	private static PrintWriter outWriter = new PrintWriter(
		new OutputStreamWriter(System.out));
	private static int n, m, k;
	private static int[][] table;
	private static final int MOD = 1000000007;
	private static long[][][][] state;
	private static long dfs(int i, int j, int num, int max)
	{
		if (state[i][j][num][max] != -1)
			return state[i][j][num][max];
		long currentAns = 0;
		if (i == n - 1 && j == m - 1)
		{
	if (num == k || max < table[i][j] && num + 1 == k)
				currentAns++;
			state[i][j][num][max] = currentAns;
			return currentAns;
		}
		if (i + 1 < n)
		{
			currentAns += dfs(i + 1, j, num, max);
			if (max < table[i][j] && num + 1 <= k)
		currentAns += dfs(i + 1, j, num + 1, table[i][j]);
		}
		if (j + 1 < m)
		{
			currentAns += dfs(i, j + 1, num, max);
			if (max < table[i][j] && num + 1 <= k)
		currentAns += dfs(i, j + 1, num + 1, table[i][j]);
		}
		state[i][j][num][max] = currentAns;
		return currentAns;
	}
	public static void main(String[] args) throws Exception
	{
		tokenizer.nextToken();
		n = (int) tokenizer.nval;
		tokenizer.nextToken();
		m = (int) tokenizer.nval;
		tokenizer.nextToken();
		k = (int) tokenizer.nval;

		table = new int[n][m];
		state = new long[n][m][k + 1][14];

		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				for (int t = 0; t <= k; t++)
					Arrays.fill(state[i][j][t], -1);

		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
			{
				tokenizer.nextToken();
				table[i][j] = (int) tokenizer.nval;
				table[i][j]++;
			}

		long ret = dfs(0, 0, 0, 0);

		outWriter.println(ret % MOD);
		outWriter.flush();
	}
}

😜斐波那契

问题描述
  斐波那契数列大家都非常熟悉。它的定义是:

f(x) = 1 … (x=1,2)
  f(x) = f(x-1) + f(x-2) … (x>2)

对于给定的整数 n 和 m,我们希望求出:
  f(1) + f(2) + … + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
  公式如下图
但这个数字依然很大,所以需要再对 p 求模。
输入格式
  输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出格式
  输出为1个整数,表示答案
样例输入
2 3 5
样例输出
0
样例输入
15 11 29
样例输出
25
蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		long n,m;
		n=sc.nextLong();
		m=sc.nextLong();
		BigInteger p=sc.nextBigInteger(),fn,fm;
		if(n+2>m)
		{
			fm=think(m,null);
	fn=think(n+2,fm).subtract(new BigInteger("1"));
	System.out.println(fn.remainder(fm).remainder(p));
		}
		else
		{
	fn=think(n+2,p).subtract(new BigInteger("1"));
			System.out.println(fn.remainder(p));
		}
	}

	private static BigInteger think(long m,BigInteger mod) {
		// TODO Auto-generated method stub
		BigInteger a1=new BigInteger("1"),a2=new BigInteger("1"),x[][];
		if(m==1)return a1;
		else if(m==2)return a2;
		else
		{
			x=new BigInteger[2][2];
			x[0][0]=new BigInteger("1");
			x[0][1]=new BigInteger("1");
			x[1][0]=new BigInteger("1");
			x[1][1]=new BigInteger("0");
			x=doublex(x,m-2,mod);
			return x[0][0].add(x[0][1]);
		}
	}

	private static BigInteger[][] doublex(BigInteger[][] x, long n,BigInteger mod) {
		// TODO Auto-generated method stub
		BigInteger x2[][];
		x2=new BigInteger[2][2];
		if(n==1)return x;
		else
		{
			if(n%2==1)return cheng(doublex(cheng(x,x,mod),n/2,mod),x,mod);
			else return doublex(cheng(x,x,mod),n/2,mod);
		}
	}

	private static BigInteger[][] cheng(BigInteger[][] x, BigInteger[][] y,BigInteger mod) {
		// TODO Auto-generated method stub
		BigInteger z[][];
		z=new BigInteger[2][2];
		if(mod!=null)
		{
			z[0][0]=x[0][0].multiply(y[0][0]).add(x[1][0].multiply(y[0][1])).remainder(mod);
	z[0][1]=x[0][0].multiply(y[0][1]).add(x[0][1].multiply(y[1][1])).remainder(mod);
	z[1][0]=x[1][0].multiply(y[0][0]).add(x[1][1].multiply(y[1][0])).remainder(mod);
	z[1][1]=x[1][0].multiply(y[0][1]).add(x[1][1].multiply(y[1][1])).remainder(mod);
			return z;
		}
	z[0][0]=x[0][0].multiply(y[0][0]).add(x[1][0].multiply(y[0][1]));
	z[0][1]=x[0][0].multiply(y[0][1]).add(x[0][1].multiply(y[1][1]));
	z[1][0]=x[1][0].multiply(y[0][0]).add(x[1][1].multiply(y[1][0]));
	z[1][1]=x[1][0].multiply(y[0][1]).add(x[1][1].multiply(y[1][1]));
		return z;
	}
}

😜波动数列

问题描述
  观察这个数列:
  1 3 0 2 -1 1 -2 …
  这个数列中后一项总是比前一项增加2或者减少3。
  栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?
输入格式
  输入的第一行包含四个整数 n s a b,含义如前面说述。
输出格式
  输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以100000007的余数。
样例输入
4 10 2 3
样例输出
2
样例说明
  这两个数列分别是2 4 1 3和7 4 1 -2。
数据规模和约定
  对于10%的数据,1<=n<=5,0<=s<=5,1<=a,b<=5;
  对于30%的数据,1<=n<=30,0<=s<=30,1<=a,b<=30;
  对于50%的数据,1<=n<=50,0<=s<=50,1<=a,b<=50;
  对于70%的数据,1<=n<=100,0<=s<=500,1<=a, b<=50;
  对于100%的数据,1<=n<=1000,-1,000,000,000<=s<=1,000,000,000,1<=a, b<=1,000,000。

public class Main {
	public static void main(String[] args) {
		int mod = 100000007;
		int n, s, a, b, i, j, t;
		int x[][] = new int[1001][1001];
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		s = sc.nextInt();
		a = sc.nextInt();
		b = sc.nextInt();
		b %= n;
		b *= -1;
		while (b < 0)
			b += n;
		a %= n;
		s %= n;
		while (s < 0)
			s += n;
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				x[i][j] = 0;
		x[1][a] = x[1][b] = 1;
		for (i = 1; i < n - 1; i++)
			for (j = 0; j < n; j++) {
				t = (j + a * (i + 1)) % n;
				x[i + 1][t] += x[i][j];
				x[i + 1][t] %= mod;
				t = (j + b * (i + 1)) % n;
				t %= n;
				x[i + 1][t] += x[i][j];
				x[i + 1][t] %= mod;
			}
		System.out.printf("%d\n", x[n - 1][s]);
	}
}

😜小朋友排队

问题描述
  n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。

每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。
  如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。
  请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
输入格式
输入的第一行包含一个整数n,表示小朋友的个数。
  第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
输出格式
  输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
样例输入
3
3 2 1
样例输出
9
样例说明
  首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。
数据规模和约定
  对于10%的数据, 1<=n<=10;
  对于30%的数据, 1<=n<=1000;
  对于50%的数据, 1<=n<=10000;
  对于100%的数据,1<=n<=100000,0<=Hi<=1000000。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	static int N = 100010;
	static int MAX = 1000100;
	static int[] C = new int[MAX];
	static int[] S = new int[MAX];
	static int[] b = new int[N];
	static long[] total = new long[N];
	static long ans;
	static int[] num = new int[N];
	static int T, s, t, i, j;

	static int Lowbit(int x) {
		return x & (-x);
	}

	static void add(int pos, int num, int[] P) {
		while (pos <= MAX) {
			P[pos] += num;
			pos += Lowbit(pos);
		}
	}

	static int Sum(int end, int[] P) {
		int cnt = 0;
		while (end > 0) {
			cnt += P[end];
			end -= Lowbit(end);
		}
		return cnt;
	}

	static void init() {
		total[0] = 0;
		for (int i = 1; i < N; ++i) {
			total[i] = total[i - 1] + i;
		}
	}
	public static void main(String[] args) throws IOException {
		init();
		BufferedReader buf = new BufferedReader(
				new InputStreamReader(System.in));
		T = Integer.parseInt(buf.readLine());
		String[] str = buf.readLine().split(" ");
		for (int j = 0; j < T; j++) {
			num[j] = Integer.parseInt(str[j]);
			add(num[j] + 1, 1, C);
			b[j] = j - Sum(num[j], C);
										
			b[j] -= Sum(num[j] + 1, C) - Sum(num[j], C) - 1;

		}
		ans = 0;
		for (int j = T - 1; j > -1; --j) {
			add(num[j] + 1, 1, S);
			b[j] += Sum(num[j], S);
			ans += total[b[j]];
		}
		System.out.println(ans);
	}
}

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】文章来源地址https://www.toymoban.com/news/detail-514857.html

到了这里,关于蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十三届蓝桥杯国赛 C++ C 组 Java A 组 C 组 Python C 组 E 题——斐波那契数组(三语言代码AC)

    如果数组 A = ( a 0 , a 1 , ⋯ . a n − 1 ) A=(a_0,a_1,⋯.a_{n-1}) A = ( a 0 ​ , a 1 ​ , ⋯ . a n − 1 ​ ) 满足以下条件, 就说它是一个斐波那契数组: n ≥ 2 ; n≥2; n ≥ 2 ; a 0 = a 1 a_0=a_1 a 0 ​ = a 1 ​ 对于所有的 i ( i ≥ 2 ) , i(i≥2), i ( i ≥ 2 ) , 都满足 a i = a i − 1 + a i − 2 。 a_i=a_{i-1}+a_{i-2

    2024年01月18日
    浏览(27)
  • 【动态规划】是泰波那契数,不是斐波那契数

    Problem: 1137. 第 N 个泰波那契数 首先我们来解读一下本题的意思🔍 相信读者在看到【泰波那契数】的时候,不禁会联想到【斐波那契数】,它们呢是一对孪生兄弟,这个 泰波那契数 相当于是 斐波那契数 的加强版 我们首先可以来看到这个递推公式 Tn+3 = Tn + Tn+1 + Tn+2 ,读者可

    2024年02月08日
    浏览(35)
  • 力扣 509. 斐波那契数

    题目来源:https://leetcode.cn/problems/fibonacci-number/description/    C++题解1:根据题意,直接用递归函数。 C++题解2(来源代码随想录):动态规划。动规五部曲:这里我们要用一个一维dp数组来保存递归的结果。 确定dp数组以及下标的含义:dp[i]的定义为第i个数的斐波那契数值是

    2024年02月15日
    浏览(28)
  • 509. 斐波那契数

    斐波那契数  (通常用  F(n)  表示)形成的序列称为  斐波那契数列  。该数列由  0  和  1  开始,后面的每一项数字都是前面两项数字的和。也就是: 给定  n  ,请计算  F(n)  。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30

    2024年02月06日
    浏览(30)
  • 动态规划-斐波那契数

    斐波那契数是一个很好的熟悉和理解动态规划的例子,通过斐波那契数可以更好的理解动态规划的精髓,动态规划是后面的计算是如何借助于前面的计算结果来加快计算速度的。 斐波那契数和斐波那契数列其实可以看成是一道题,只不过两题的限制性条件稍微有差别 斐波那

    2024年02月14日
    浏览(26)
  • 斐波那契算法的理解

    1.斐波那契数列  : 数组:int[] F= {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }; 特点: 从第三个数开始,后边每一个数都是前两个数的和 。 F[k]=F[k-1]+F[k-2]; 如图所示:         ①low、mid、high都是F数组的索引,F[k]-1表示长度。         ②为了方便计算出mid,变形:F[k]-1 = (F[k-1]-1) + (F

    2024年02月08日
    浏览(34)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(34)
  • 斐波那契数列应用2

    目录 斐波那契数列应用2 程序设计 程序分析  系列文章 【问题描述】定义如下序列:f(1)=1,f(2)=1;f(n)=(A*f(n-1)+B*f(n-2))mod7     给定A和B,请你计算f(n)的值。 【输

    2023年04月10日
    浏览(40)
  • Python斐波那契数列

    斐波那契数列是一个经典的数学问题,在 Python 中可以使用多种方法来实现,下面是几个常见的实现方式: 1. 使用递归 ```python def fibonacci_recursive(n):     if n = 1:         return n     else:         return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 2. 使用循环 ```python def fibonacci_i

    2024年02月02日
    浏览(31)
  • 博弈论 | 斐波那契博弈

    博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包