蓝桥杯省赛

蓝桥杯省赛知识点模板复习及知识点(仅复习)

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N][N],f[N];

int main()
{	//01背包 
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j]=f[i-1][j];
			if(j>v[i])f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);
		}
	}
	//完全背包二重循环,一维数组 
	 for(int i=1;i<=n;i++)
	 {
	 	for(int j=v[i];j<=m;j++)
	 	{
	 		f[j]=max(f[j],f[j-v[i]]+w[i]);	
		}
	 }
	 //高精度加法
	  string a,b;
	  while(cin>>a>>b)
	  {
	  	int a1[1001]={0},b1[1001]={0},c[1001]={0},ans=0;
	  	for(int i=0;i<a.size();i++)a1[i]=a[a.size()-i-1]-'0';
	  	for(int i=0;i<b.size();i++)b1[i]=a[b.size()-i-1]-'0';
	  	
	  	while(ans<a.size()||ans<b.size())
	  	{
	  		c[ans]+=a1[ans]+b1[ans];
			if(c[ans]>=10)
			{
				c[ans]-=10;
				c[ans+1]+=1;	
			}
			ans++;	
		}
		if(c[ans]==0)ans--;
		for(int i=ans;i>=0;i--)cout<<c[i];
		cout<<endl;
	  }
	  return 0;
	//埃氏筛
	bool prime[N]
	for(int i=2;i<=1e5;i++)prime[i]=1;
	for(int i=2;i<=1e5;i++)
	{
		if(prime[i])
		{
			for(int j=i*2;j<=1e5;j+=i)
			{
				prime[j]=0;	
			}	
		}	
	}
	//欧拉筛
	int st[N];
	int prime[N];
	int ans;
	for(int i=2;i<=1e7;i++)
	{
		if(!prime[i])st[++ans]=i;
		for(int j=1;i*st[j]<=1e7;j++)
		{
			prime[i*st[j]]=1;
			if(i%st[j]==0)break;	
		}	
	}
	//异或不一样为1,一样为0
	//最大公约数
	int gcd(int x,int y)
	{
		if(y==0)
		{
			return x;
		}else{
			return gcd(y,x%y);
		}	
	}
	//最小公倍数x*y/gcd(x,y)
	//二维前缀和
	int s[N][N];
	int n,m,q;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>s[i][j];
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//前缀和数组
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//前缀和数组
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];	
		}
		cin>>q;
		while(q--)
		{
			int x1,x2,y1,y2	;//x1,y1左上角,x2,y2右上角
			cin>>x1>>y1>>x2>>y2;//计算区间和,和一维的s[n]-s[l-1]一样
			cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
			cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
			cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;	 
		}	
	}
	//记忆化搜索
	int fun(int n)
	{
		if(f[n])return f[n];
		if(n<2)return f[n]=n;
		return f[n]=fun(n-1)+fun(n-2);	
	}
	//二分,单调序列 
	//向左靠
	if(l<r)
	{
		int mid=l+r>>1;
		if(check(mid))r=mid;
		else l=mid+1;	
	}
	//向右靠
	if(l<r)
	{
		int mid=l+r+1>>1;
		if(check(mid))l=mid;
		else r=mid-1;	
	}
	//浮点二分
	if(r-l>1e-5)
	{
		double mid=(r+l)/2;
		if(check(mid))l=mid;
		else r=mid;	
	}
	//两个二分函数
	int a[]={1,2,3,4,5};b[]={5,4,3,2,1};
	upper_bound(a,a+5,3)-a;//返回第一个比3大的地址,从0开始,为3
	lower_bound(a,a+5,3)-b;//返回第一个大于等于3的地址,从0开始,为2
	//加上greater<int>()相反
	//快速幂
	int a,b;
	cin>>a>>b;//求a的b次方
	while(b)
	{
		int ans=1;
		if(b&1)ans=ans*a%mod;
		a=a*a;
		y>>=1;
	} 
	//char输入空格为cin.get(),string输入空格为getline(cin,数组名)
	//向上取整(A+B-1)/B,向下取整直接int,对应ceil和floor
	//多行读入
	void read()
	{
		char ch;
		int i=0;
		while((ch==getchar())&&ch!=EOF)
		{
			str[i++]=ch;	
		}	
	}//Ctrl+Z退出 
	//数组表示单链表
	int h[N],e[N],ne[N],idx;
	memset(h,-1,sizeof(h));
	//在头节点后加元素
	void add(int a){
		e[idx]=a,ne[idx]=head,head=idx++;
	}
	//在一个元素后加一个元素
	void add(int a,int b){
		e[idx]=b;
		ne[idx]=ne[a];
		ne[a]=idx++;
	}
	//删除某个元素后面的元素
	void remove(int a){
		ne[a]=ne[ne[a]];
	}
	//st表,快速求区间最大值
	init(){
		for(int i=1;i<=n;i++){
			f[i][0]=a[i];
		}
		for(int k=1;k<20;k++){
			for(int i=1;i+(1<<k-1)<=n;i++){
				f[i][k]=max(f[i][k-1],f[i+(1<<k-1)][k-1]);
			}
		}
	}
	int query(int x,int y){
		int k=log2(y-x+1);
		return max(f[x][k],f[y-(1<<k)+1][k]);
	}
	int a[N];
	int f[N][25];
	cin>>a[N];
	init();
	cout<<query(1,15);
	//秦九韶算法,求字符串数字任意进制转十进制
	string a;
	int b;
	int fun(string x,int y){
		int t=x.size();
		int ret=0;
		for(int i=0;i<t;i++){
			ret=ret*y+(x[i]-'0');
		}
	}
	int main(){
		cina>>b;
		int c=fun(a,b);
		cout<<c;
	} 
	//bfs和dfs就不写了
	//算了,bfs的模板写一下吧
	void bfs()
	{
		//如果要用到两个数据
		queue<pair<int,int>> p;
		//一个数据
		queue<int> p;
		p.push();
		while(!p.empty()){
			int x=p.front();
			//或者
			int x=p.front().first;
			int y=p.front().second;
			p.pop()//这一步不能忘记
			//一般vis[nx][ny]=vis[x][y]+1; 
		}	
	}
	//拓扑排序
	int d[N];
	vector<int> e[N],tp;
	int n;
	bool tpsort(){
		queue<int> p;
		for(int i=1;i<=n;i++){
			if(d[i]==0)p.push(i);
		}
		while(!p.empty()){
			int x=p.front();p.pop();
			tp.push_back(x);
			for(auto ed:e){
				if(--din[ed]==0)p.push(ed);
			}
		}
		return tp.size()==n;
	}
	int main(){
		int m;
		int a,b;
		cin>>n>>m;
		for(int i=0;i<m;i++){
			cin>>a>>b;
			e[a].push_back(b);
			d[b]++;
		}
		if(!tpsort())cout<<-1;
		else cout<<"Yes";
	}
	//Dijkstra堆优化
	int n,m;
	int a,b,c;
	struct node{
		int x,y,z;
	};
	vector<node> e[N];
	priority_queue<pair<int,int>> p;
	bool vis[N];
	int d[N];
	void dijkstra(int t){
		for(int i=1;i<=n;i++)d[i]=1e9;
		d[t]=0;
		p.push({0,t});
		while(!p.empty()){
			int x=p.top().first;
			int y=p.top().second;
			p.pop();//千万别忘了 
			if(vis[y])continue;
			vis[y]=1;
			for(auto ed:e[y]){
				int tx=ed.x,ty=ed.y;
				if(d[tx]>d[y]+ty){
					d[tx]=d[y]+ty;
					p.push(-d[tx],tx);
				}
			}
		}
	}
	
	int main(){
		cin>>n>>m;
		for(int i=0;i<m;i++){
			cin>>a>>b>>c;
			e[a].push({b,c});
			e[b].push({a,c});
		}
		int k;
		dijkstra(k);
	}
	//SPFA,借用上面数据
	int cnt[N];//增加点数组
	bool spfa(int a){
		queue<int> p;
		memset(d,0x3f,sizeof(d));
		d[a]=0;vis[a]=1;p.push(a);
		while(!p.empty()){
			int x=p.front();p.pop();vis[x]=0;
			for(auto ed:e[x]){
				int tx=ed.x,ty=ed.y;
				if(d[tx]>d[x]+ty){
					d[tx]=d[x]+ty;
					cnt[tx]=cnt[x]+1;
					if(cnt[tx]>n)return true;
					if(!vis[tx])p.push(tx),vis[tx]=1;
				}
			}
			return false;	
		}
	}
	//Floyd
	int d[N][N];
	void floyd(){
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
				}
			}
		}
	}
	cin>>n>>m;
	memset(d,0x3f,sizeof(d));
	for(int i=1;i<=n;i++)d[i][i]=0;
	for(int i=0;i<m;i++){
		cin>>a>>b>>c;
		d[a][b]=min(d[a][b],c);
	}
	floyd();
	//并查集核心
	int f[N];
	int fun(int x){
		if(x!=f[x])f[x]=fun(f[x]);
		return f[x];
	}
	for(int i=1;i<=n;i++)f[i]=i;//初始值 
	//把a点和b点放在一起,b为父节点 
	f[fun(a)]=fun(b);
	//进制转换就不写了 
}

写的是核心代码模板,考前看一看,回顾一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值