
蓝桥杯
历年题目
重you小垃
这个作者很懒,什么都没留下…
展开
-
决赛第7届JavaB组
-------------------------------------------题目:平方末尾思路:平方数最后两位仅仅与原数的末尾两位有关,所以枚举0-99的平方取末尾两位,然后去重,计数即可。-------------------------------------------题目:七星填数思路:给每个顶点编号,然后取全排列对应位的数字来判断即可。-------------------------------------------题目:赢球票思路: 模拟过程。----------原创 2021-05-31 22:56:13 · 92 阅读 · 0 评论 -
决赛第9届c++B组
调手表思路1:DP先只考虑只按k的按钮,然后再把1的按钮考虑进去。#include <iostream>using namespace std;const int maxn = 1e5 + 5;int main(){ int n, k; cin >> n >> k; int dp[maxn]; //没有访问过在经历下面这个循环之后会是一个未定义的值,所以应该先赋值一个比较大的值或者赋值为i也可以!!! for (int i =原创 2021-05-29 12:16:54 · 199 阅读 · 0 评论 -
决赛第8届c++B组
思路:一共有15个瓷砖,枚举每个瓷砖(有两种放法:横/竖;两种颜色,所以会有四种选择),最后去重一下。去重原因:注意:1.放的顺序:一定是一行一行放,当前行放满了再放下一层2.题目中说:只考虑组合方案,忽略瓷砖的拼缝。所以最后要去重一下。3.去重不要用数组保存,用一个状态变量每个位代表每个瓷砖的颜色/字符串存储到set中进行去重。...原创 2021-05-28 10:20:00 · 135 阅读 · 0 评论 -
决赛第7届c++B组
思路1: 列方程前进x步,后退y步,97x-127y=1 ,限制条件是x,y都大于1,找x+y的最小值。找个范围暴力求。思路2: 求逆元。97x=1mod(127) ,求出x后,(x%127+127)%127就是逆元。输出 abs(x)+abs(y) 就是需要的值。 注意:求逆元得到的x是一个满足的最小正整数。y是负数的话代表相反的方向,所以结果应该是向前移动的步数和向后移动的步数的和:abs(x)+abs(y)...原创 2021-05-26 14:57:41 · 200 阅读 · 0 评论 -
RSA解密(暴力约数分解+求逆元+快速幂+快速乘)
思路:1.先暴力求出p, q2.求逆元得到私钥e,注意:快速幂求逆元可能会越界,通过扩展欧几里得求。3.用快速幂+快速乘。求(a^b) mod n#include <bits/stdc++.h>using namespace std;long long n = 1001733993063167141LL;long long fast_cheng(long long a, long long b, long long n){ //求(a*b) mod n long long.原创 2021-04-19 19:24:24 · 850 阅读 · 0 评论 -
第39阶台阶
#include <bits/stdc++.h>using namespace std;int cnt = 0;void dfs(int stp, int jie){ if (jie == 39 && stp % 2 == 0) { cnt++; return ; } if (jie >= 39) return ; dfs(stp + 1, jie + 1); dfs(stp + 1, jie + 2);}// dfs(0, 0);//.原创 2021-04-17 15:31:15 · 87 阅读 · 0 评论 -
立方和(long long转换)
易错点:超过9次方以上的数据,用int会越界!拓展:定义数组超过6次方就要放到main外面。判断是否超时看是否超过了8次方的计算#include <bits/stdc++.h>using namespace std;int main(){ long long result = 0; int n = 2019; for (long long i = 1; i <= n; ++i){ //i一定要用long long类型!! int j = i; int..原创 2021-04-09 12:22:22 · 267 阅读 · 0 评论 -
修改数组(并查集,set区间维护)
思路一:并查集,find()存储的是并查集中要变的值,但是忽略了题目中出现负数的情况。#include <bits/stdc++.h>using namespace std;//并查集 father[i] 存储数字i要变的值 ,假设只有正整数。 int father[1000005];int a[1000005];void init(){ for (int i = 0; i < 1000005; ++i){ father[i] = i; } return ;} ..原创 2021-04-09 12:03:14 · 444 阅读 · 0 评论 -
作物杂交(蓝桥)
总结: const int maxn = 0x3f3f3f3f; 设置为int的最大值思路:动态规划状态转移方程:dp[n] = min(dp[n], max(f(a), f(b)) + max(tim[a], tim[b]));#include <bits/stdc++.h>using namespace std;/*6 2 4 65 3 4 6 4 91 21 2 31 3 42 3 54 5 6*/const int maxn = 0x3f3f3f3...原创 2021-04-03 11:27:36 · 392 阅读 · 0 评论 -
回文日期(日期处理)
思路:1:按年份枚举就可以,不用一天一天枚举(因为是按照前四个数字回文的)。2:构造出回文判断是否满足年月日的形式,得到result1和result2易错点:1:构造出回文以后需要先判断是否满足年月日的形式!!!2:字符串转整型 atoi(s.c_str())不能用stoi(),它是c++11的标准3:整型转字符串 while (tmp != 0){ //整型转换成字符串 s.insert(s.begin(), tmp % 10 + '0'); tmp /= 10;..原创 2021-03-24 22:28:01 · 688 阅读 · 0 评论 -
七段码(建图+搜索+并查集)
思路:step1:邻接表建图,相邻为1,不相邻为0,题目就等价为在图中求连通子图的个数。step2:深度搜索每条边,并存储下来。step3:对选择的边用并查集保存下来,然后看father[i] == i的个数,等于1,表示连通,否则表示不连通。易错点:1:建图时别忘了[5][6] 和[2][3] 也是相邻的2:dfs如果需要存储搜索的结果,用一个数组的0和1来保存就行3:选子序列的dfs代码为: flag[i] = 1; dfs(i + 1); flag[i] = 0; dfs(i.原创 2021-03-24 16:02:36 · 698 阅读 · 1 评论 -
蛇形填数(考数组斜着访问)
思路:#include <bits/stdc++.h>using namespace std;//a为奇数: a&1 ==1 否则为0 int main(){ int cnt = 1; int a[40][40]; for (int i = 0; i < 39; ++i){ for (int j = 0; j < 39; ++j){ a[i][j] = 0; } } for (int i = 1; i <=39; ++i){ .原创 2021-03-23 22:03:18 · 175 阅读 · 0 评论 -
平面分割(圆和直线,数学题)
总结:只考虑直线的情况:n条直线能把一个平面划分成几部分:假设第n-1条直线已经放好产生f(n-1)个区域,放第n条直线时,为了划分区域更多,第n条直线与前面的n-1条直线产生n-1个交点,因此产生了n-2个线段,和2条射线。n-2个线段(交点数-1)和2条射线将会新增n个区域,所以:f(n) = f(n-1) + n=f(n-2) +n-1+n;…=f(1)+2+3+…n=2+2+3+…n = (1+n)n/2 + 1;也就是:n条直线能把一个平面划分成(1+n)n/2 + 1部分。只考虑圆的情原创 2021-03-21 16:53:15 · 1877 阅读 · 0 评论 -
寻找2020(文件,数组中使用滑动窗口)
问题描述】小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。小蓝只关注三种构成 2020 的方式:• 同一行里面连续四个字符从左到右构成 2020。• 同一列里面连续四个字符从上到下构成 2020。• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。例如,对于下面的矩阵:220000000000002202000000000022002020一共有 5 个 2020。其中 1 个是在同一行里的,1原创 2021-03-21 11:25:14 · 92 阅读 · 0 评论 -
约数个数(蓝桥)
6的约数:1 2 3 6 ,输出4问78120 输出多少#include <bits/stdc++.h>using namespace std;int main(){ int n; int cnt = 0; cin >> n; for (int i = 1; i < sqrt(n); ++i){ if (n % i == 0) cnt += 2; } int sqrt_ = (int)sqrt(n); //做法:上面循环不包括 =sqrt(n)原创 2021-03-21 10:12:47 · 283 阅读 · 0 评论 -
带分数(全排列的实现,分段)
输入:100 输出:11思路::先创建一个数组,分别存储1到9,然后进行全排列,分段。全排列的实现:可以用头文件中的next_permutation函数,也可以用dfs的模板来实现。分段的实现:题目中n的范围是小于10的6次方。123456789,所以第一个数字的范围是前5位,分子的范围是从下一位到倒数第2位,分母的范围是从下一位到最后一位。易错点:如果n=a+b/c,b/c可能为小数,然后取整,所以为了避免这样的情况,cn = ac+b;所以abc都为long long直接用库函数的实现:...原创 2021-03-21 09:49:34 · 151 阅读 · 0 评论 -
打印十字图(图形题)
思路分析:找规律,从外到内一圈一圈的改变数组内的元素。数组定义大小:观察规律发现:行列都是5+4*n;题目中n范围小于30;当n为30时,行列空间为125,所以定义map[130][130]足够了。#include <bits/stdc++.h>using namespace std;int main(){ char map[130][130]; //题目范围<30 ,最多125*125的地图 int n; cin >> n; int m ...原创 2021-03-19 21:07:32 · 194 阅读 · 0 评论 -
核桃的数量(最大公因数,最小公倍数)
思路:先求出a 和 b的最小公倍数,再求b和c的最小公倍数#include <bits/stdc++.h>using namespace std;//最大公因数 int gcb(int a, int b);//最小公倍数 int beishu(int a, int b); int main(){ int a, b, c; cin >> a >> b >> c; //先求a b的最小公倍数为m int m = beishu(a.原创 2021-03-19 18:19:37 · 173 阅读 · 0 评论