第十二届蓝桥杯C++赛后感

文章目录

  • A 空间
  • 卡片
  • 直线
  • 货物摆放
  • 路径
  • 时间显示
  • G砝码称重
  • H杨辉三角形
  • 双向排列
  • J括号序列

注:有些代码忘了考试时怎么写的了,(我也懒得重新写),所以很多题的代码是acwing蓝桥杯讲解里的,我对其进行注释和修改

A 空间

在这里插入图片描述
32位程序中,INT变量占用4个字节
1mb=1024kb
1kb=1024B
1B=8b
B:byte
b:bit
32位二进制数是四个字节
实际上就是求256MB有多少个32 bit

答案:256*1024*1024/4
= 67108864

卡片

在这里插入图片描述
直接模拟即可

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b)
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int a[10];bool iff(int x) 
{while (x) {int y = x % 10;if (a[y])a[y]--;elsereturn 0;x /= 10;}return 1;
}int main() {for (int i = 0; i <= 9; i++) a[i] = 2021;for (int i = 1;; i++) {if (!iff(i)) {cout << i - 1 << endl;break;}}return 0;
}
答案:3181

直线

在这里插入图片描述
比赛时用set实现的,忘了自己做的对不对。。
我当时做的方法是因为两点确定一线,所以枚举两个点,然后用set记录斜率和截距(y=k*x+b),但是k有可能不存在,所以最后的答案还要额外加上20
当时代码懒得写了,按照其他博主的写法重新写的,只不过用的不是set,存下所有k和b后,排序,将重复的k和b删掉

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b)
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn = 200000;
double eps=1e-8;
int n;
struct Line
{double k, b;bool operator< (const Line& t) const{if (k != t.k) return k < t.k;return b < t.b;}
}L[maxn];int main()
{for (int x1 = 0; x1 < 20; x1 ++ )for (int y1 = 0; y1 < 21; y1 ++ )for (int x2 = 0; x2 < 20; x2 ++ )for (int y2 = 0; y2 < 21; y2 ++ )if (x1 != x2){double k = (double)(y2 - y1) / (x2 - x1);double b = y1 - k * x1;L[n ++ ] = {k, b};//存两点所形成的直线 }sort(L, L +maxn);int res = 1;for (int i = 1; i < n; i ++ )if (fabs(L[i].k - L[i - 1].k) > eps || fabs(L[i].b - L[i - 1].b) > eps)//说明不是一条直线 res ++ ;cout << res + 20 << endl;//加20是因为k不存在的直线也要考虑 return 0;
}

我当时的做法是对的,但是最后的答案忘了是不是这个

答案:40257

货物摆放

在这里插入图片描述
LWH都是n的约数,问有多少种方案,其实就是求n的约数,用这些约数进行组合。因为约数不是很多,所以三重循环枚举约数,看是否等于n
对n求约束,直接开方求就行(因为如果x是约数,那么n/x也是,所以只需要将范围缩小到根号n)
(比赛时我是这么做的,确信)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;typedef long long LL;int main()
{LL n;cin >> n;vector<LL> d;for (LL i = 1; i * i <= n; i ++ )if (n % i == 0){d.push_back(i);if (n / i != i) d.push_back(n / i);}int res = 0;for (auto a: d)for (auto b: d)for (auto c: d)if (a * b * c == n)res ++ ;cout << res << endl;return 0;
}
答案:2430

路径

在这里插入图片描述
就是一个建边跑最短路。。比赛时忘了gcd咋写emm
好像有的用dp来做?

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 2200, M = N * 50;int n;
int h[N], e[M], w[M], ne[M], idx;
int q[N], dist[N];
bool st[N];int gcd(int a, int b)  // 欧几里得算法
{return b ? gcd(b, a % b) : a;
}void add(int a, int b, int c)  // 添加一条边a->b,边权为c
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}void spfa()  // 求1号点到n号点的最短路距离
{int hh = 0, tt = 0;memset(dist, 0x3f, sizeof dist);dist[1] = 0;q[tt ++ ] = 1;st[1] = true;while (hh != tt){int t = q[hh ++ ];if (hh == N) hh = 0;st[t] = false;for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if (!st[j])     // 如果队列中已存在j,则不需要将j重复插入{q[tt ++ ] = j;if (tt == N) tt = 0;st[j] = true;}}}}
}int main()
{n = 2021;memset(h, -1, sizeof h);for (int i = 1; i <= n; i ++ )for (int j = max(1, i - 21); j <= min(n, i + 21); j ++ ){int d = gcd(i, j);add(i, j, i * j / d);}spfa();printf("%d\n", dist[n]);return 0;
}
答案:10266837

时间显示

在这里插入图片描述
比赛时忘了1s等于多少ms,还好电脑自带计算器里有时间的进制关系(狗头🐕)

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;int main()
{LL n;cin >> n;n /= 1000;n %= 86400;int h = n / 3600;n %= 3600;int m = n / 60;int s = n % 60;printf("%02d:%02d:%02d\n", h, m, s);return 0;
}

G砝码称重

在这里插入图片描述
背包问题
自己对dp真的不熟。。五一要好好练练dp
在这里插入图片描述
对于每个砝码他有三个选择,称的左侧,右侧和不放,
我们设dp[i][j]表示前i个物品中,总质量为j的情况是否存在,dp为bool型
对于第j个物品,我们说了有三种选择,所以我们可以得到转移方程:

分别对应不选,放左侧,放右侧
dp[i][j]|=dp[i-1][j]
dp[i][j]|=dp[i-1][j-w[i]]
dp[i][j]|=dp[i-1][j+w[i]]

按照题目要求j-w[i]最小为-m,数组不能用负下标,所以我们加一个偏移量B,保证数组下标都为非负

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 110, M = 200010, B = M / 2;int n, m;
int w[N];
bool f[N][M];int main()
{scanf("%d", &n);for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]), m += w[i];f[0][B] = true;for (int i = 1; i <= n; i ++ )for (int j = -m; j <= m; j ++ ){f[i][j + B] = f[i - 1][j + B];if (j - w[i] >= -m) f[i][j + B] |= f[i - 1][j - w[i] + B];if (j + w[i] <= m) f[i][j + B] |= f[i - 1][j + w[i] + B];}int res = 0;for (int j = 1; j <= m; j ++ )if (f[n][j + B])res ++ ;printf("%d\n", res);return 0;
}

H杨辉三角形

在这里插入图片描述
在这里插入图片描述
因为杨辉三角形左右对称,所以我们只考虑左半部分
我们进行枚举可以看出,斜列的数量不会超过20个,所以枚举每一个斜列,每个斜列的第一个元素也是递增排列且有关系(第一个斜列的首元素为C(1,0),第二个为C(1,2),第三个为C(2,4),…C(x,2x)),斜列内的元素是递增排列的,且大小都有公式关系(比如第3个斜列,第一个元素是C(2,4),第二个元素是C(2,5),然后是C(2,6)…),然后二分找具体位置
如果第C(r,k)是我们要找的元素,他的位置就是r * (r + 1) / 2 + k + 1
思维题
妙啊,当时写了一个半暴力,真想不到

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;int n;LL C(int a, int b)
{LL res = 1;for (int i = a, j = 1; j <= b; i --, j ++ ){res = res * i / j;if (res > n) return res;}return res;
}bool check(int k)
{//C(a,b)//a>=2b,二分a LL l = k * 2, r = n;while (l < r){LL mid = l + r >> 1;if (C(mid, k) >= n) r = mid;else l = mid + 1;}if (C(r, k) != n) return false;cout << r * (r + 1) / 2 + k + 1 << endl;return true;
}int main()
{cin >> n;for (int k = 16; ; k -- )if (check(k))break;return 0;
}

双向排列

讲解链接

J括号序列

在这里插入图片描述
肯定是dp,但是我不会。。。等会了再更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SeaweedFS在.net core下的实践方案

一直对分布式的文件储存系统很感兴趣&#xff0c;最开始关注淘宝的TFS&#xff08;Taobao File System&#xff09;&#xff0c;好像搁浅了&#xff0c;官方地址无法访问&#xff0c;github上面&#xff0c;各种编译问题&#xff0c;无意间发现了SeaweedFS链接seaweedfs测试了一…

[C++ STL algorithm] lower_bound、upper_bound、unique的本质

lower_bound&#xff1a;返回第一个大于等于查找值的地址upper_bound&#xff1a;返回第一个严格大于查找值的地址 使用这两个函数需要的头文件 #include <algorithm> using namespace std;要求数组必须是有序/单调的 lower_bound lower_bound( a 1, a n 1, x );意…

蓝桥杯 I.双向排序

题目链接 题解&#xff1a; 比赛时就直接写了一个暴力sort交上&#xff0c;能骗一点分是一点 昨晚看了acwing的讲解&#xff0c;现在结合我的思路更新正解 题目中设计两个操作&#xff0c;一个是选定前x个数&#xff0c;使其降序&#xff0c;另一个是选定后y个数&#xff0c…

YbtOJ-交换游戏【树链剖分,线段树合并】

正题 题目大意 给出两棵树&#xff0c;对于第一棵树的每一条边(x,y)(x,y)(x,y)询问有多少条在第二棵树上的边(u,v)(u,v)(u,v)与其交换&#xff08;连接的序号相同&#xff09;后两棵树依旧是一棵树。 1≤n≤21051\leq n\leq 2\times 10^51≤n≤2105 解题思路 先只考虑一棵树的…

模板:树状数组二分

所谓树状数组二分&#xff0c;就是在树状数组上进行二分 &#xff08;逃&#xff09; 解析 很巧妙 我们都知道可以在线段树上利用其本身平衡二叉的性质进行二分&#xff0c;很多时候能剩下一个log 但是树状数组其实也是可以二分的 说是二分&#xff0c;其实更像倍增 毕竟不…

微软收购Citus Data | 再次肯定对开源的承诺,并加速了Azure PostgreSQL的性能和扩展...

作者&#xff1a;Rohan Kumar 翻译&#xff1a;周宝峰 从左到右&#xff1a;微软开源关系数据库总经理Sudhakar Sannakkayala&#xff0c;Citus Data首席技术官兼联合创始人Ozgun Erdogan&#xff0c;Citus Data首席执行官兼联合创始人Umur Cubukcu&#xff0c;Citus Data工…

【CF1307F】Cow and Vacation(并查集+lca倍增)

description 点击查看题目 solution 考虑将边拆分&#xff0c;边长2\times 22 然后将kkk步以内可以互相走到的点用并查集合并在一起 同一个连通块的关键点可以相互走到 然后对于询问的两个城市&#xff0c;uuu向vvv走kkk步&#xff0c;vvv向uuu走kkk步&#xff0c;然后判断是…

AreYouBusy

AreYouBusy 题意: 给你n个工作集合&#xff0c;给你T的时间去做它们。给你m和s&#xff0c;说明这个工作集合有m件事可以做&#xff0c;它们是s类的工作集合&#xff08;s0,1,2&#xff0c;s0说明这m件事中最少得做一件&#xff0c;s1说明这m件事中最多只能做一件&#xff0c…

CF1404C:Fixed Point Removal(离线)(树状数组二分)

解析 写了不少线段树上二分&#xff0c;原来树状数组上也是可以二分的 首先如果ai>ia_i>iai​>i&#xff0c;那必然无法删除&#xff0c;下面只考虑ai<ia_i<iai​<i的情况 本题试图离线不难想到&#xff0c;但我一开始总是按照刻板思维尝试按序移动左端点&…

AT4439-[AGC028E]High Elements【结论,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/AT4439 题目大意 给出1∼n1\sim n1∼n的排列aaa。求一个字典序最小的010101串sss满足将000对应位置按顺序取出成为序列AAA&#xff0c;剩下的成为序列BBB。 要求AAA和BBB的前缀最大值个数相同。 1≤n≤21051\leq n\leq 2\ti…

Docker最全教程——MongoDB容器化(十三)

上一节我们讲述了数据库容器化之持久保存数据&#xff0c;本节将讲诉MongoDB容器化实践&#xff0c;并且接下来将逐步讲解其他数据库&#xff08;MySql、Redis等等&#xff09;的容器化实践&#xff0c;然后将讲诉一些分布式架构的项目实践。由于实践需要花费大量的时间&#x…

一些数学小公式/定理的证明

文章目录定理①&#xff1a;类欧几里得算法公式①&#xff1a;等比数列求和②&#xff1a;等差数列一次方和③&#xff1a;等差数列二次方和结论①&#xff1a;n&11⇒3∣(2n−2)n\&11\Rightarrow 3|(2^n-2)n&11⇒3∣(2n−2)②&#xff1a;1222...n2n(n1)(2n1)61^22…

背包模型题目集合

文章目录背包模型01背包AcWing 423. 采药AcWing 1024. 装箱问题Luogu 2925 干草出售Proud Merchants完全背包P1616 疯狂的采药P1853 投资的最大效益Piggy-Bank多重背包Luogu P1776 宝物筛选HDU 1059 Dividing混合背包P1833 樱花二维费用背包问题P1507 NASA的食物计划HDU 2159 F…

CF1063F-String Journey【SAM,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/CF1063F 题目大意 给出一个字符串&#xff0c;求选出kkk个不交子串满足按照起始位置排序后&#xff0c;满足下一个是上一个的真子串。 求kkk的最大值。 1≤n≤51051\leq n\leq 5\times 10^51≤n≤5105 解题思路 首先我们肯…

CF1406D:Three Sequences(贪心、构造)

解析 本题说明了样例的重要性 完全可以通过仔细观察样例得出一些结论 首先最大值显然就是max⁡(b1,cn)\max(b_1,c_n)max(b1​,cn​) 考虑最优策略 如果a上升了&#xff0c;就让b上升 因为假设前面都拼的严丝合缝了&#xff0c;让c上升前面全得上升&#xff0c;肯定会对答案有…

在.NET Core中使用Exceptionless分布式日志收集框架

一.Exceptionless简介Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web Api&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;MVC 等技术栈的应用程序中&#xff0c;并且提供了…

YbtOJ-选点构形【欧拉函数】

正题 题目链接:https://www.ybtoj.com.cn/contest/351/problem/1 题目大意 一个圆上&#xff0c;你需要在3∼n3\sim n3∼n中选出kkk个作为aia_iai​&#xff0c;然后再圆上选择最少的点使得对于每个aia_iai​你都能用选出的点连成一个正aia_iai​边形。 k2≤n≤106k2\leq n\l…

CF1406E:Deleting Numbers(构造、根号分块)

解析 打表发现1e5以内的质因子是9592个 就是它没错了 容易想到枚举因子判断答案是否异常来判断是否包含该质因子 但是这个方法在最小质因子处是不奏效的 那么如何找到最小的质因子呢&#xff1f; 考虑把所有的质因子分成m\sqrt mm​块 然后每扫完一块&#xff0c;问一下 (A,…

test1 3-15 模拟赛1

文章目录考试复盘matrixsetstring考试复盘 首先先说T1T1T1&#xff0c;嗯&#xff0c;发现了列是相互独立的&#xff0c;所以分开考虑了 但是实在没想到线性基&#xff0c;就顺着自己的思路硬搞了505050跑路 老实说&#xff0c;505050分的部分分写得都是迷迷糊糊的&#xff0c;…

华为云提供针对Nuget包管理器的缓存加速服务测试

在Visual Studio 2013、2015、2017中&#xff0c;使用的是Nuget包管理器对第三方组件进行管理升级的。而且 Nuget 是我们使用.NET Core的一项基础设施&#xff0c;.NET的软件包管理器NuGet.org是一项面向全球用户搭建的服务&#xff0c;不论用户身在何处&#xff0c;NuGet.org都…