蓝桥国赛合集

压线通过蓝桥初赛,是能震惊一整年的程度。
6.5复赛,只会暴力是不行的。
于是得了国优…大三心态完全不同,目标:至少刷近五年的决赛真题并打卡。冲就完事。
-------------------2020蓝桥国赛A组(C++ ---------------------------------
A合数个数:一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 3不是合数,4, 6 是合数。请问从 1 到 2020 一共有多少个合数。
答案:1713
思路:暴力(注意边界,细心点

#include 
#include 
using namespace std;
bool check(int x){ //质素检验函数
    for (int i=2;i<int(sqrt(x))+1;i++){
        if (x%i==0) return true;
    }
    return false;
}
int main(){
    int res=0;
    for (int i=4;i<2021;i++){
        if (check(i)) res+=1;
    }
    cout<<res<<endl;
    return 0;
}

B:含 2 天数
题目:如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日到公元 9999 年 12月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字2。
思路:1 3 4 5 6 7 8 9 10 11月含有12天个2【2、12、20-29】;
闰年2月含29天2,平年2月含28个2;12月含31个2。
年份含2时,闰年含366天,平年含365天。
注意平闰判断方法!
答案:1994240

#include 
using namespace std;
int num[4]={366,365,180,179};
bool year(int x){ //判断闰年平年
    if ((x%100)==0 && (x%400==0))return true;
    if ((x%100) && (x%4)==0) return true;
    return false;
}
bool have2(int x){ //判断年份是否含2
    while (x){
        if (x%10==2) return true;
        x/=10;
    }
    return false;
}
int main(){
    int res=0;
    for (int i=1900;i<=9999;i++){
        if (have2(i)){ //年份含2
            if (year(i)) res+=num[0]; //闰年
            else res+=num[1]; //平年
        }
        else{
            if (year(i)) res+=num[2];
            else res+=num[3];
        }
    }
    cout<<res;
    return 0;
}

C: 本质上升序列
蓝桥国赛合集_第1张图片
思路:典型的动态规划,dp[i]存储以i结尾的递增序列的个数。
注意如何去掉本质相同的子序列!
答案:3616159

#include 
using namespace std;
typedef long long ll;
ll dp[1000];
void init(){ //动态规划矩阵初始化
    for (int i=0;i<200;i++) dp[i]=1;
}
int main(){
    string in="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
    init();
    ll sum=0;
    for (int i=1;i<200;i++){
        for (int j=0;j<i;j++){
            if (in[j]<in[i]) dp[i]+=dp[j];
            else if (in[i]==in[j]) dp[i]-=dp[j]; //本质相同者去掉
        }
    }
    for (int i=0;i<200;i++) sum+=dp[i];
    cout<<sum;
    return 0;
}

E: 玩具蛇
题目:小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。蓝桥国赛合集_第2张图片
思路:DFS——visit置1,搜索下一层,visit置0。
答案:552

#include 
using namespace std;
int visit[4][4],cnt=0;  //设置是否经过,计数
int x[4]={-1,0,1,0},y[4]={0,-1,0,1}; //探索方向
void init(){  //重新开始的初始化函数
    for (int i=0;i<4;i++){
        for (int j=0;j<4;j++) visit[i][j]=0;
    }
}
void dfs(int i,int j,int step){
    if (step==16){ //数字16被放置成功
        cnt+=1;
        return;
    }
    for (int k=0;k<4;k++){
        int nx=i+x[k],ny=j+y[k];
        if (nx<0 || ny<0 || nx>3 || ny>3 || visit[nx][ny]==1) continue; //违规数据和已占格子
        visit[nx][ny]=1;
        dfs(nx,ny,step+1); //搜索下一层
        visit[nx][ny]=0;
    }
}
int main(){
    for (int i=0;i<4;i++){
        for (int j=0;j<4;j++){
            init();
            visit[i][j]=1;
            dfs(i,j,1); //开始本次搜索
            visit[i][j]=0;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

链接: 2020国赛题目.

2019国赛:部分题目+解析链接.

2018国赛:部分题目+解析链接.

2017国赛:部分题目+解析链接.

2016国赛:部分题目+解析链接.

2013-2017部分题目+解析整理.

总结:感谢大佬们!!!(不要随便立flag & 明天去凑个人头

--------- 来自6.5半夜十二点半睡不着的小傻瓜--------------------

你可能感兴趣的:(蓝桥省赛,c++)