蓝桥杯常考的算法模版

//二进制压位 
int ans=0;
for(int i = 0;i < (1<<14);i++){
	int tot_1=0;
	int tot_0=0;
	int num = 2;
	for(int j = 0;j < 14;j++){
		if(i&(1<<j)){
			tot_1++;
			num = num*2;
		}else{
			tot_0++;
			num=num-1;
		}
	}
	if(tot_1==5&&tot_0==9&&num==1){
		ans++;
	}
} 
//01背包问题
for(int i = 1;i <= N;i++){
	for(int j = 0;j <= v;j++){
		if(j>=w[i]){
			dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
		}else{
			dp[i][j]=dp[i-1][j];
		}
	}
} 
//完全背包问题
for(int i = 1;i <= N;i++){
	for(int j = c[i];j <= v;j++){
		dp[i][j]=max(dp[i-1][j],dp[i][j-c[i]]+w[i]);
	}
}
dp[N][v];

//最长上升子序列 
int dp[MAX_N],a[MAX_N],n,ans=0;
for(int i = 1;i <= n;i++){
	dp[i]=1;
	for(int j = 1;j < i;j++){
		if(a[j]<a[i]){
			dp[i]=max(dp[i],dp[j]+1);
		}
	}
	ans=max(ans,dp[i]);
}

//最长公共子序列
char s1[MAX_N],s2[MAX_N];
int n,ans=0,lcs[MAX_N][MAX_N];
for(int i = 1;i <= n;i++){
	for(int j = 1;j <= n;j++){
		lcs[i][j]=0;
		if(s1[i]==s2[j]){
			lcs[i][j]=lcs[i-1][j-1]+1;
		}else{
			lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);
		}
		ans=max(ans,lcs[i][j]);
	}
}
//欧几里得算法(最大公约数):辗转相除法
int gcd(int a,int b){
	if(b==0){
		return a;
	}
	return gcd(b,a%b);
} 
//欧几里得算法:辗转相除法
int gcd(int a,int b){
	if(b==0){
		return a;
	}
	return gcd(b,a%b);
}
//欧几里得算法:辗转相除法
int gcd(int a,int b){
	if(b == 0){
		return a;
	}
	return gcd(b,a%b);
} 
//最小公倍数
lcm(a,b)=(a*b)/gcd(a,b);
//质数筛选:埃氏筛选法
int n;
for(int i = 2;i <= n;i++){
	is_prime[i]=1;//初始化为质数 
}
for(int i = 2;i*i<=n;i++){
	if(is_prime[i]){
		for(int j = i*i;j<=n;j+=i){
			is_prime[j]=0;
		}
	}
}

//质数筛选法:埃氏筛选法
int n;
for(int i=2;i<=n;i++){
	is_prime[i]=0;//初始化为质数 
} 
for(int i=2;i*i<=n;i++){
	if(is_prime[i]){
		for(int j=i*i;j<=n,j+=i){
			is_prime[j]=0;
		}
	}
}

#include <algorithm> 
#include <string.h> 
#include <iostream> 
#include <stdio.h>
#include <string>
#include <vector> 
#include <queue> 
#include <map> 
#include <set> 
using namespace std; 

//判断闰年
int is_leap_year(int year){
	if(year%400==0 ||(year%100!=0&&year%4==0)){
		return 1;
	}
	return 0;
}

//判断闰年
int is_leap_year(int year){
	if(year%400==0||(year%100!=0&&year%4==0)){
		return 1;
	}
	return 0;
} 

//判断闰年
int is_leap_year(int year){
	if(year%400==0||(year%100!=0&&year%4==0)){
		return 1;
	}
	return 0;
}

//二分法优化
int l=1,r=max_num;
while(l<r){
	int mid=(l+r+1)/2;
	if(cut_ok(mid)){
		l=mid;
	}else{
		r=mid-1;
	} 
} 

//暴力搜索:dfs。凑算式
#include<stdio.h>
int num[10];
int ans=0;
bool visit[10];

void solve(){
	double sum = num[0]+(double)num[1]/num[2]+(double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]);
	if(sum==10){
		ans++;
	}
	void dfs(int index){
		if(index==9){
			solve();
			return;
		}
		for(int i=1;i<10;i++){
			if(!visit[i]){
				visit[i]=true;
				num[index]=i;
				dfs(index+1);
				visit[i]=false;
			}
		}
	}
	
	int main(){
		dfs(0);
		printf("%d\n",ans);
		return 0;
	}
	
} 

//快速排序
void swap(int a[],int i,int j){
	int t = a[i];
	a[i] = a[j];
	a[j] = t;
}

int partition(int a[],int p,int r){
	int i = p;
	int j = r+1;
	int x = a[p];
	while(1){
		while(i<r&&a[++i]<x);
		while(a[--j]>x);
		if(i>=j)break;
		swap(a,i,j);
	}
	swap(a,p,j);
	return j;
}

void quicksort(int a[],int p,int r){
	if(p<r){
		int q = partition(a,p,r);
		quicksort(a,p,q-1);
		quicksort(a,q+1,r);
	}
}
int main(){
	int a[]={5,12,65,44,2,8,62,4,3,98,14,25};
	int N=12;
	
	quicksort(a,0,N-1);
	for(int i = 0;i < N;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值