本文章基于《计蒜客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
*/