距离蓝桥杯省赛还有三天,开始临时抱佛脚。
文中涉及知识均来自蓝桥杯官方给出的2020年真题解析视频
原视频:http://weike.lanqiao.cn/static/coursehuifang/LNZTC++A/content/%E7%AC%AC%E4%B8%80%E8%8A%822013%E5%B9%B4%E7%9C%81%E8%B5%9B%E7%9C%9F%E9%A2%98%E8%AF%A6%E8%A7%A3.html?courseid=18&dayclassid=1097
1.数字和字符互相转换
用到了sstream库。
#include<bits/stdc++.h>
using namespace std;
void i2s(int i, string &str){ //整数转为字符串
stringstream ss;
ss<<i;
ss>>str;
}
void s2i(string str, int &i){ //字符串转为整数
stringstream ss;
ss<<str;
ss>>i;
}
2.STL模板库的常用操作函数
(1)项目实例-vector
#include<bits/stdc++.h>
struct price{ //定义一个结构体,作为容器存储的数据类型
int a,b,c;
}
vector<price> v1; //定义两个price容器
vector<price> v2;
int main(){
string str;
if(str.find('3')!=string::npos||str.rfind('0')==3){ //sring.find()查找字符,返回一个位
//置值,若没找到则返回npos;
//string.rfind(str)是从字符串右
//侧开始匹配str,并返回在字符串中的位置(下标)
continue;
}
else{
price p={i, int_i, plus);
v1.push_back(p); //vector.pushback()把元素插入容器末尾
}
(2)常用STL标准模板库函数总结
i.迭代器iterator
vector<string>Food; //定义容器
vector<string>::iterator FoodIter; //定义迭代器
Food.insert(Food.end(),"----"); //尾插字符串
for(FoodIter=Food.begin();FoodIter!=Food.end();++FoodIter) //使用迭代器循环显示字符串
{
cout<<*FoodIter<<endl;
}
ii.push_back()与pop_back()
void PrintLine(string& StringLine)
{
cout<<StringLine<<endl;
}
list<string> Food; //定义链表
Food.push_back("---"); //尾插字符串
Food.pop_back(); //删除最后一个元素
for_each(Food.begin(),Food.end(),PrintLine); //循环显示字符串。for_each()是STL中遍历算法,需要导入algorithm库。第三个参数是自己定义的普通函数作为函数对象。最后结果输出为空
iii.vector
num.insert(num.begin(),99);
//另一种insert()
//void insert(iterator loc, size_type num, const TYPE &val) 指定位置loc前插入num个值为val的元素
for(unsigned i=0;i<num.size();i++)
{
cout<<num[i]<<endl;
}
num.erase(num.begin()); //删除第一个元素;vector.erase()还有另一种用法:num.erase(iterator start,iterator end)用于删除[start,end)之间的元素
vector<int>::iterator Iter=num.begin(); //定义迭代器
for(Iter=num.begin();Iter!=num.end();Iter++)
{
cout<<*Iter<<" ";
}
num.insert(Iter,4,5); //经历一轮循环后迭代器指向尾部,在尾部插入4个5
输出结果为:99 5 5 5 5
for(i=0;i<num.size();i++){
cout<<num.at(i)<<endl; //vector.at()返回指定位置的元素
}
//构造函数
vector<int>num(5,99); //num容器内容:5个99
vector<int>num1(num); //拷贝num容器
vector<int>num2(num.begin(), num.end()); //拷贝num容器
//访问vector信息
max_size(); //返回vector可以最多容纳元素的数量
size(); //返回当前vector元素的数量
//STL排序函数sort()
sort(num.begin(),num.end());
//STL函数count()
int number=count(num.begin(),num.end(),99); //数num里有几个99
iv.stack
stack<int>mystack;
mystack.push(8);
int temp;
while(!mystack.empty())
{
temp=mystack.top(); //取栈顶元素(不弹出)
mystack.pop(); //弹栈
}
v.queue
queue<int>myqueue;
myqueue.push(1);
while(!myqueue.empty()){
cout<<myqueue.front()<<" "; //返回队首元素,不出队
cout<<myqueue.back()<<" "; //返回队尾元素,不出队
myqueue.pop(); //队首元素出队
}
vi.priority_queue
特殊队列,每次都是最大的元素在队首。操作与queue类似。
vii.set
元素有序、唯一性。
set<int>S;
S.insert(item);
S.erase(item);
S.clear();
S.empty();
S.size();
S.find(k); //返回一个迭代器,指向键值k
S.lower_bound(k); //~~,指向键值>=k的第一个元素
S.upper_bound(k); //~~,~~<k的~~
viii.map
map<string,int>s; //map定义,关键字为string,相同的string只能出现一次
s["Monday"]=1;
(3)sort()函数
bool my_less(int i,int j){ return (i<j);}
vector<int>a={3,7,2,5,4};
sort(a.begin(), a.begin()+4); //对前四个排序
sort(a.begin(),a.end()); //从小到大排序
sort(a.begin(),a.end(),less<int>()); //从小到大
sort(a.begin(),a.end(),my_less); //自定义排序
sort(a.begin(),a.end(),greater<int>()); //从大到小
//对结构变量排序
struct Student{
char name[256];
int score;
}
bool compare(struct Student* a, struct Student*b){
return a->score>b->score;
}
vector<struct Student*>stuVec;
sort(stuVec.begin(),stuVec.end(),compare);
//相关函数
stable_sort(); //元素相等时保留原序
(4)字典序排列与比较函数
//基本比较函数
min();
max();
abs(); //绝对值
fabs(); //浮点数绝对值,可用于判断浮点数大小相等:fabs(x-y)<eps,其中,eps为1e-8
//字典序比较
lexicographical_compare(first1,last1,first2,last2,compare);
//返回下一个排序的序列
next_permutation(first,last);
//返回上一个排序的序列
prev_permutation(first,last);
(5)其他
memset(loc,const &var,size); //初始化例:memset(a, -1, sizeof(a)); a为int数组
3.编程大题对于输入数据的处理
例:拆分一行的单个数据
int line; //第一行输入行数
cin>>line;
getchar(); //吃掉换行符
int index=0; //数组下标
for(int i=0;i<line;i++){
string s;
getline(cin,s); //读入一行数据
istringstream iss(s); //处理整行文本并化为行内的单个数据,用istringstream封装
string tmp;
while(getline(s,tmp,' ')){ //getline(stream,string,delim) 遇到delim裁剪s到tmp
s2i(tmp,data[index++]); //字符转数字
}
}
4.数学相关
i.不定方程ax+by=c,若a、b互质,一定有无穷多解;若c是gcd(a,b)的倍数,一定有无穷多解
ii.闰年判断:x(年号)能被4整除,不能被100整除;或者能被400整除
5.常用算法
i.递归回溯+剪枝(dfs)
int sum =0;
void f(int i,int j,int sum,int cnt){ //递归函数
if(sum>n/2) return; //首先判断出口条件
if(sum==n/2){
ans=min(ans,cnt);
return;
}
vis[i][j]=1; //标记为已访问
//四个分支
if(i+1<=n-1 && vis[i+1][j]==0)f(i+1,j,sum+g[i][j],cnt+1);
if(i-1>=0 && vis[i-1][j]==0)f(i-1,j,sum+g[i][j],cnt+1);
if(j+1<=m-1 && vis[i][j+1]==0)f(i,j+1,sum+g[i][j],cnt+1);
if(j-1<=0 && vis[i][j-1]==0)f(i,j-1,sum+g[i][j],cnt+1);
vis[i][j]=0; //重置为未访问(回溯)
}
int main(){
...
f(0,0,0,0);
...
}