算法竞赛总结
2025.03.30 CCF CSP 认证考试
优点
- 应该具有能做出前四道题的自信
- 前四道题每道题都应拿分
- 第一题必拿分
- 第二题拿70分以上
- 第三题、第四题拿部分分
反思
- 对于输入输出还需要更加深入理解
cin / cout
scanf / printf
gets / puts
getchar / putchar
- 对于动态规划的问题还要深入理解
- 不只是01背包,还有完全背包,多重背包问题
- 模拟题还需要加强理解,不要着急做题,最好把整个解题过程写下来再开始敲代码
输入/输出
- 在第3道模拟题中,我遇到了一个问题,就是输入的问题
- 这道题的输入数据是这样的:
1 a $a $b
,其中:-
1
:表示变量类型 -
a
:表示变量名 -
$a $b
:表示变量存储的内容
-
- 这是,我对于如何将
$a $b
存到一个字符串中感到很疑惑,我采用了如下方式读取输入数据
int type;
string var_name, var_content;
cin >> type >> var_name;
gets()
- 但是上面的代码在ccf csp的编译器上报了
编译错误
,我记得当时的bug是:
error: ‘gets’ was not declared in this scope
-
很明显,这个函数不存在;其实
gets()
是c
中的函数,在一些版本较新的编译器已经被删除掉了,例如gcc 17
-
正确做法:全程使用
c++
的输入函数
#include <bits/stdc++.h>
using namespace std;
int main(){
string line;
getline(cin, line);
// 这个函数是读取整行内容
// getline(cin, line, ',');
// 这个函数是读取到第一个逗号
stringstream ss(line);
string type_str, var_name, var_content;
ss >> type_str >> var_name;
getline(ss, var_content);
if(!var_content.empty() && var_content[0] == ' ')
var_content = var_content.substr(1);
cout << "类型: " << type_str << endl;
cout << "变量名: " << var_name << endl;
cout << "变量值: " << var_content << endl;
return 0;
}

- 正确做法:
#include <bits/stdc++.h>
using namespace std;
int main(){
string var_type, var_name, var_content;
string s;
cin >> var_type >> var_name;
while(cin.peek() == ' ')
cin.get();
while(cin.peek() != '\n' && cin >> s){
if(!var_content.empty())
var_content += ' ';
var_content += s;
}
cin.ignore();
cout << "类型: " << var_type << endl;
cout << "变量名: " << var_name << endl;
cout << "内容: " << var_content << endl;
return 0;
}
- 讲解:
-
cin.peek()
:查看下一个字符但是不取出 -
cin.ignore()
:默认忽略一个字符,用于清理行尾换行符,防止干扰下一次读取 -
cin >> s
:用作循环判断条件时,可以判断是否输入成功
-
while(cin >> s)
// 循环,如果成功读取到一个字符(遇到空格或者换行符就结束),就继续循环
2025.04.12 蓝桥杯C/C++ A组
优点
- 已经可以解决多道问题
反思
- 应该熟练DFS/BFS的板子
- 对于一些模拟题,不用只局限于样例,还应该自己测试一些样例
Enjoy Reading This Article?
Here are some more articles you might like to read next: