//蓝桥杯
#include<cstring>
#include<algorithm>
#include<memory.h>
#include<vector>
#include<set>;
//1.常用函数
{
sort(a,a+n);
sort(vector.begin(),vector.end());
sort(a,a+n,cmp);
low_bound(a,a+n,x);//二分查找,查找大于或等于X的第一个位置,只能查找vector<>,
//返回值vector<>::iteartor指针
unique(vector.begin(),vector.end());//返回重排后最后一个不重复的后面的迭代器
reverse(vector.begin().vector.end());//反转元素顺序
next_permutation(p,p+n);//求下一个全排列
}
//2.vector
{
//头文件
#include<vector>
//实例:
vector<int>b(5); vector<int>a;
//赋值:
b[0]=1 //只有第一种定义可以这样赋值
//函数
int k=a.size(); //大小
a.push_back(x);//尾部添加
a.resize(a.size-i);//删除后面i个元素
a.pop_back();//删除最后一个元素
a.clear();//清空
a.empty();//判断是否为空
a.insert(x,y);//向vector数组的x位置插入元素Y,返回值为iterator, x为iterator类型指针
a.erase(x);//删除X位置的元素,x 为指针
vector<>::iterator it; //定义可以指向其元素的指针
//一维用法
//1.创建
vector<int>nums;
vector<int>nums(n);
//2.添加元素
nums.push_back(1);
//3.删除
nums.resize(nums.size-i);//删除后面I个元素
nums.pop_back();//删除最后的元素
//4.遍历
for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<endl;
}
//5.排序(O(nlog(n))
sort(nums.begin(),nums.end());
//6.反转
reverse(nums.begin(),nums.end());
//7.合并两个vector:合并nums1和nums2,并将合并后的数组赋值给nums
vector<int> nums1(m),nums2(n);
vector<int> nums;
nums.resize(m+n);
merge(nums1.begin(), nums1.end(),nums2.begin(),nums2.end(),nums);
//二维用法
//1.定义
vector<vector <int> > nums(m ,vector<int>(n)); //m*n的二维vector
//2.遍历
int m=nums.size();
int n=nums[0].size();
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
cout<<nums[i][j]<<endl;
}
}
}
//3.set 集合,其中不包含重复元素,其中元素从小到大排好顺序,从1开始
{
//定义
set<int>a;
//函数
iterator find(x);//若找到x,返回该键值迭代器的位置,
//否则,返回最后一个元素后面一个位置,即s.end()
iterator erase(iterator x);//删除set集合的值为x的元素,
//返回值为下一个位置的迭代器
set<>::iterator it;//为一个可以指向其元素的指针
iterator insert(y);//向set集合插入元素y
}
//4.map
{
//头文件
#include<map> //映射,索引
//定义实例
map<string,int>month_name;
//赋值
map<"July">=7;
//函数
iterator find(y);//y指的 "July"
iterator insert(map<string,int>("July",7)); // 插入
iterator erase(iterator x);//删除
iterator begin(),返回头指针
iterator end(),返回尾指针
map<>::iterator it;//指针
//函数实例
map<string,int>m;
map<string,int>::iterator it;
it=m.find("Judy");
if(it==m.end())
cout<<"we do not find Judy!"<<endl;
else
m.erase(it);
}
//5.queue,stack
{
//头文件
#include<queue>
//函数
void push(x);//将值x压入栈
void pop();//删除顶部元素
top();//获得栈顶元素,但不删除
bool empty();//检查是否为空
int size()//获取大小
//头文件
#include<stack>
//函数
void push(x);//将值x入队
void pop();//出队
front();//获得队头元素,但不删除
bool empty();//检查是否为空
int size();//获取大小
}
//string
{
#include<cstring>
string substr(int pos,int n)//返回从pos 开始的N个字符串
//例:
main()
{
string s("12345asdf");
string a=s.substr(0,5); //获得字符串s中 从第0位开始的长度为5的字符串
//默认时的长度为从开始位置到尾
cout<<a<<endl;
}
//输出结果为:
//12345
string &insert(int p0, const char *s); //在p0位置插入字符串
//例
string s("12345asdfv");
string p=s.insert(0,"abc");
string &erase(int pos = 0, int n = npos); //删除pos开始的n个字符,返回修改后的字符串
//例
string p=s.erase(0,5);
int find(char c, int pos = 0) const; //从pos开始查找字符c在当前字符串的位置
int find(const char *s,int pos = 0) const; //从pos开始查找字符串s在当前串中的位置
}
//算法
//1.快速排序
void quicksort(int *a,int l,int r)
{
if(l<=r)
return;
int temp=a[l];
int i=l,j=r;
while(i<j)
{
while(i<j)
{
if(a[j]>=temp)
{
j--;
}
else
{
a[i++]=a[j];
break;
}
}
while(i<j)
{
if(a[i]<=temp)
{
i++;
}
else
{
a[j--]=a[i];
break;
}
}
a[i]=temp;
quicksort(a,l,i-1);
quicksort(a,i+1,r);
}
//2.归并排序
void mergesort(int *a,int l,int r,int *b )
{
if(l>=r)
return;
int mid=l+r;
mid/=2;
mergesort(a,l,mid,b);
mergesort(a,mid+1,r,b);
int k=l,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=mid)
b[k++]=a[i++];
while(j<=r)
b[k++]=a[j++];
for(int k=l;k<=r;k++)
a[k]=b[k];
}
}
//3.并查集
#define N 100
int father[N];
void init()
{
for(int i=0;i<=N;i++)
father[i]=i;
}
void union(int x,int y)
{
x=getfather(x);
y=getfather(y);
if(x!=y)
father[x]=y;
}
int same(int x,int y)
{
return getfather(x)==getfather(y);
}
int getfather(int x)
{
while(x!=father(x))
{
x=father(x);
}
return x;
}
int getfather(int x)
{
if(x!=father(x))
father(x)=getfather(father(x));
return father(x);
}
//4.01动态背包
int f[5000];
int v[500],w[500];
int mx;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(j=m;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i])
mx=max(mx,f[j]);
}
}
cout<<mx;
}
//5.最长上升子序列
int LIS(int *a,int n)
{
int dp[n];
int mx=0,m;
dp[0]=1;
for(int i=1;i<n;i++)
{
m=0;
for(int j=0;j<i;j++)
{
if(dp[j]>m&&a[j]<a[i])
{
m=dp[j];
}
}
dp[i]=m+1;
mx=max(mx,dp[i]);
}
return mx;
}
//6.Dijkstra
void Dijkstra(int n,int start)
{
int k=start;
int min;
for(int i=0;i<n;i++)
{
mark[i]=0;
dist[i]=edge[start][i];
}
mark[start]=1;
dist[start]=0;
for(int i=0;i<n;i++)
{
min=MAX;
for(int j=0;j<n;j++)
{
if(!mark[j]&&dist[j]<min)
{
min=dist[j];
k=j;
}
}
mark[j]=1;
for(int j=0;j<n;j++)
{
if(!mark[j]&&dist[j]>dist[k]+edge[k][j])
dist[j]=dist[k]+edge[k][j];
}
}
}
next_permutation(p,p+n);
next_permutation(p,p+n);
next_permutation(p,p+n);
//7.快速幂
int pow3(int x,int n)
{
if(n==0)
return 1;
else
{
while(n&1==0)
{
n>>1;
x*=x;
}
}
int res=x;
n>>=1;
while(n!=0)
{
x*=x;
if((n&1)!=0)
res*=x;
n>>1;
}
return res;
}
//8.最大公约束
int gcd(int a,int b)
{
int temp;
while(a%b!=0)
{
temp=a;
a=b;
b=temp%b;
}
return b;
}
//9.可重复选择的组合:
//有N个不同元素,每个元素可以选多次,一共选k个元素,有多少种选法?
//C(n+k-1,k)
蓝桥杯总结——常用函数与算法
最新推荐文章于 2022-04-07 13:18:38 发布