蓝桥杯总结——常用函数与算法

//蓝桥杯

#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)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值