1,040
社区成员




我参加的是蓝桥杯软件组b组C/C++组,获得省级一等奖。
该比赛在学校竞赛目录中为C级竞赛。报名费300元。
(本文档仅是我个人的体验哈哈哈哈,每个人还是应该去探索自己的学习方式~)
如果你的语言基础比较薄弱或者从来没有接触过算法,那么建议先去刷基础题,把自己的语法练到炉火纯青、不会出错,习惯做题模式和提交方式,就开始学正式的算法。
如果说你的语言基础非常好了,那么就可以开始学习一个个攻破算法基础点啦!
需要掌握的基本算法:暴力、枚举、模拟、递归、递推、记忆化搜索、搜索、贪心、回溯、素数、动态规划(去年国赛很多这个)……
如果你是选择C/C++的话,以下知识点得掌握:
STL中容器的运用(可以给你的代码编写带来很大的便利)
C++的输入输出 (输入输出的优化……)
善用algorithm中的函数(或其他的库),有的函数需要自己写仿函数。
进阶算法:树、二叉树、并查集、图论、数论、高精度、深搜、广搜……
(想冲大奖,咱就是说还是得好好学)
PS:蓝桥杯不要求一道题一定做全对,所以可以骗分,咱就是不会写的话暴力法用起来,能骗一分是一分哈~
个人觉得算法刷题很重要,但是总结也很重要~所以在学习算法点的时候最好做一下总结~
推荐网站:
1.洛谷:首页 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
2.蓝桥杯练习系统:http://lx.lanqiao.cn/
3.PTA:PTA | 程序设计类实验辅助教学平台 (pintia.cn)
4.力扣:题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台
力扣是以函数的形式去写题。
前期工作做完后有一定的基础了,可以适当总结一下自己所学的知识,知道自己掌握的情况。然后可以去打一些训练赛,我记得每年蓝桥杯官网都会开放一些训练赛,大家可以去打一下,看看自己到底打的怎么样。然后查漏补缺,补短板。
后期的话其实能力都差不多定型了,这个时期就多去刷一下蓝桥杯往年的真题,看一下题型和题目难度。
不用背函数哈~比赛会有相关文档提供,库里面有哪些函数,都可以看。
在蓝桥杯比赛当天到来之前,每天至少保证刷一题(保持手感)。
蓝桥杯是早上9点开始比赛,吃好早餐!!!(今年没有发牛奶!不吃早餐得饿到下午QAQ,很饿的情况下脑子真的会变笨),最好提前到场,检查一下电脑的编译环境,然后熟悉比赛的流程和模式。
看到赛题后先把会做的做了(先保证拿到一个基本分数),然后不会的就想办法暴力骗分(这是可以说的)。
时间很充足,不要慌,尽力而为~~~
这个比赛的话拿奖还是比较容易的,好好准备一定可以!
可以浅浅总结一下 ,要是你成绩比较好还可以给别人传授传授。
万一你一不小心冲进国赛了,咱们就是说系统的学一下上面的一些进阶算法,能拿个国奖确实还蛮nice的(对于我们这种非ACM常驻人员来说)。
好好把握机会,不要摆烂!
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n = 2022;
int ans = 0;
int i = 0;
while(n!=0){
ans += pow(9,i)*(n%10);
n /= 10;
i++;
}
cout << ans; //1478
return 0;
}
这题有点争议(012到底算不算顺子日期)。最后答案都算正确:4 or 14。
这题我直接枚举。
#include <iostream>
using namespace std;
typedef long long ll; //测试用例达到10^18,需要使用long long
int main() {
ll a,b,n;
cin >> a >> b >> n;
ll weeks = n / (5*a + 2*b); //先算至少需要多少星期,公式法是最快的O(1)
ll then = n % (5*a + 2*b); //计算出剩多少题目是在剩下不到一周的时间内能看完的
ll ans = 0; //记录答案
while(then > 0){ //当书看完后结束循环
if(ans < 5)
then -= a;
else
then -=b;
ans++;
}
ans += weeks*7;
cout << ans;
return 0;
}
这道题 手推个三四道就能找到规律
#include <bits/stdc++.h> //万能头文件
using namespace std;
int main() {
vector<int> a(10005);
int n;
cin >> n;
if(n==1) { //特判
cout<<1;
return 0;
}
int s = (n-1)*2;
int l = 0,r = n-1; //双指针控制
while(l <= r) {
a[l] = s,a[r] = s;
l++,r--;
s -= 2;
}
for(int i = 0; i < n; i++)
cout << a[i] << endl;
return 0;
}
//比赛的时候我用的模拟,到数大了就错了,还是朴实的方法好用QAQ,省时省力
这道题的难点在题目理解,我看了好久才看懂。
#include <bits/stdc++.h> //万能头文件
using namespace std;
typedef long long ll;
int main() {
int n,ma,mb;
cin >> n;
cin >> ma;
vector<int> a(100005,0),b(100005,0);
for(int i = ma-1 ;i >= 0;i--){ //数据从低位到高位存
cin >> a[i];
}
cin >> mb;
for(int i = mb-1;i >= 0;i--){
cin >> b[i];
}
ll jinzhi = 1;
ll ans = a[0]-b[0];
ll mod = 1000000007;
for(int i = 1;i < ma;i++){
ll tmp = a[i]-b[i];
if(tmp > 0){
jinzhi *= max(2,max(a[i-1]+1,b[i-1]+1));
ans = (ans + tmp*jinzhi)%mod;
}
else{
jinzhi *= n;
ans = (ans + tmp*jinzhi)%mod;
}
}
cout << ans;
return 0;
}
样例说明
满足条件的子矩阵一共有 19,包含:
大小为 1×1 的有 10 个。 大小为 1×2 的有 3 个。 大小为 1×3 的有 2 个。 大小为 1×4 的有 1 个。 大小为 2×1 的有 3 个。
评测用例规模与约定
对于 30% 的数据,N , M ≤ 20 N,M≤20N,M≤20; 对于 70% 的数据,N , M ≤ 100 N,M≤100N,M≤100; 对于 100% 的数据,1 ≤ N , M ≤ 500 , 0 ≤ A i , j ≤ 1000 , 1 ≤ K ≤ 250000000 1≤N,M≤500,0≤Ai,j≤1000,1≤K≤2500000001≤N,M≤500,0≤Ai,j≤1000,1≤K≤250000000。
前缀和,我使用的方法偏暴力(我肯定不是满分,但是肯定有分),优化方案当时没想出来。
不会。。。但是据说是洛谷上一道题的改编题。
这题就是暴力模拟,设置好标志,最后算总数就OK。
//暴力模拟
#include <bits/stdc++.h> //万能头文件
using namespace std;
typedef long long ll;
struct lei{
int x,y,r;
bool boom;
};
vector<lei> leo(50004);
vector<lei> pai(50005);
int n,m;
void pailei(lei s){
for(int i = 0;i < n;i++){
//如果在范围内就爆
if(pow(s.x-leo[i].x,2)+pow(s.y-leo[i].y,2) <= pow(s.r+leo[i].r,2) && leo[i].boom == 0){
leo[i].boom = 1;
pailei(leo[i]);//递归调用
}
}
}
int main() {
cin >> n >> m;
for(int i = 0;i < n;i++){
cin >> leo[i].x >> leo[i].y >> leo[i].r;
leo[i].boom = 0;
}
for(int i = 0;i < m;i++){
cin >> pai[i].x >> pai[i].y >> pai[i].r;
pai[i].boom = 0;
}
for(int i = 0;i < m;i++)
pailei(pai[i]);
int ans = 0;
for(int i =0;i < n;i++) {
if(leo[i].boom == 1)
ans++;
}
cout <<ans;
return 0;
}
//本题为递归、动态规划写法
#include <iostream>
#define MOD 1000000007
using namespace std;
int fun(int n,int m,int jiu) {
if(n < 0 || m < 0) return 0; //错误情况
if(n == 0 && m == 1 && jiu == 1) return 1; //处理最后一步
else return (fun(n-1,m,jiu*2)+fun(n,m-1,jiu-1)) % MOD; //递归
}
int main() {
int n,m;
cin >> n >> m;
cout << fun(n,m,2);
return 0;
}
没时间写了,这题考场没看,考后也没看哈哈哈哈。
最后希望大家拿到自己想要的成绩~
以上如有不对请指出~