蓝桥杯算法练习笔记(3)__提升代码能力

本文章基于《计蒜客2019年蓝桥杯算法训练营》整理记录,仅用于个人学习交流使用。

3.提升代码能力

1.斐波那契数列
/*
题目:输入n,求斐波那契数列f(n)对 1e9+7 的模
f(n)%mod == (f[i-1]+f[i-2])%mod;
*/

#include<iostream>
using namespace std;

int f[100005]; 
int mod=1e9+7;
int main(){
	int n;
	cin>>n;
	f[1]=1;
	f[2]=1;
	for(int i=3;i<=n;i++){
		f[i]=(f[i-1]+f[i-2])%mod;
	}
	cout<<f[n]<<endl;
} 
//f(n)%mod == (f[i-1]+f[i-2])%mod;
2.旋转矩阵
/*
题目:
	输入一个n*m的矩阵,顺时针旋转90°后输出
思路:
	规律:现在的每一行是原来每一列的倒序,例如现在第一行的10 7 -1是原来第一列的-1 7 10的倒序
输入:
	3 4
	-1 3 6 3
	7  7 9 1
	10 3 4 6
输出:
	10 7 -1
	3 7 3
	4 9 6
	6 1 3
*/
#include<iostream>
using namespace std;
//规律:现在的每一行是原来每一列的倒序 
int num[205][205]; 
int main(){
	int n,m;
	cin>>n>>m;
	//存储 
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>num[i][j];
		}
	}
	//输出
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cout<<num[n-1-j][i]<<" ";
		}
		cout<<endl;
	} 
	
	
	return 0;
}
3.子矩阵的最大和
//子矩阵的最大和
#include<iostream>
using namespace std;

/*
题目:
	求一个矩阵中非空的和最大的子矩阵
输入:
	n行,m列,m*n个矩阵元素
输出:
	子矩阵的最大元素和 
解题:
	暴力求解,复杂度,n的6次方 √ 
	动态规划,复杂度,n的3次方	 
*/

int A[55][55]; 

int main(){
	int n,m,ans;
	cin>>n>>m;
	ans=-1005;//足够小
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>A[i][j];
		}
	} 
	
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			for(int k=0;k<m;k++){
				for(int l=k;l<m;l++){
					int temp=0;//代表空矩阵 
					for(int p=i;p<=j;p++){
						for(int q=k;q<=l;q++){
							temp=temp+A[p][q];
						}
					}
					if(temp>ans){
						ans=temp;
					}
					
				}
			}
		}
	}
	
	cout<<ans<<endl;
	return 0;
}

/*案例:
输入: 
3 3
2 -4 1
-1 2 1
4 -1 2
输出: 
7 

*/
4.去重排序
//去重 排序 
#include<iostream>
#include<algorithm>
using namespace std;
/*
题目:
	输入n个数,对于相同的树只保留一个,并升序排列 
输入:
	10
	20 40 32 67 40 20 89 300 400 15
输出:
	8
	15 20 32 40 67 89 300 400
*/
int num[105],ans[105]; 
int main(){
	int n,m;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>num[i];
	} 
	sort(num,num+n);
	m=0;
	for(int i=0;i<n;i++){
		if(i!=0 && num[i]!=num[i-1]){
			ans[m++]=num[i-1];
		}
	}
	ans[m++]=num[n-1];
	cout<<m<<endl;
	for(int i=0;i<m;i++){
		cout<<ans[i]<<" ";
	} 
	return 0;
}
5.转化为回文数
//变化为回文数 
#include<iostream>
using namespace std;
/*
任意一个不是回文数的整数,交换高低位与原数相加,57重复,将得到回文数
例如: 57-- (57 + 75) 132 --(132 + 231) 363
输出:步数,变化过程 
*/
int num[1005];//记录变化过程 
int digit[1005];//记录每n的每一位 
//判断是不是回文的函数 
bool judge(int x){
	int cnt=0;//记录位数 
	while(x){
		digit[cnt++]=x%10;
		x/=10;
	}
	for(int i=0;i<cnt/2;i++){
		if(digit[i]!=digit[cnt-1-i]){
			return false;
		}
	}
	return true;
} 
//反转数字高低位的函数
int rev(int x){
	int ret=0;
	while(x){
		ret=ret*10+x%10;
		x=x/10;
	}
	return ret;	
} 
int main(){
	int n;//
	int m=0;//记录步数 
	cin>>n;
	num[m++]=n;
	while(!judge(n)){
		n=n+rev(n);
		num[m++]=n;
	}
	cout<<m-1<<endl;
	for(int i=0;i<m;i++){
		if(i!=m-1){
		cout<<num[i]<<"--->"; 
		} else{
			cout<<num[i]<<endl;
		}
	}
	return 0;
} 
/*
输入: 
	349
	3
输出: 
	349--->1292--->4213--->7337
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值