2020第十一届蓝桥杯国赛个人题解+源代码

先存个样~~之后补全
个人解法,可能不是最佳,欢迎指错


小总结,第一次参加总得来一个国二,(但我还是很菜)
下面是自己习惯性用的头文件

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<vector>
#include<cmath>
#define  pii pair<int,int>
#define mem(kk,i) memset(kk,i,sizeof kk)
using namespace std;
typedef long long ll;
const int maxn=1e7;
const int INF=0x3f3f3f3f;
/*next_permutation();
prev_permutation():
*/

A:美丽的 2

【问题描述】
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2?

思路:直接1-2020枚举判断

int main(){
    int tot=0;
    for(int i=1;i<=2020;i++){
        int k=i;
        while(k){
            int g=k%10;
            k/=10;
            if(g==2){tot++;break;}
        }
    }
    cout<<tot<<endl;
  return 0;
}

答案:563


B:扩散

【题目描述】
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。

思路:bfs跑,,然后时间在2020内都记录,边记录边累计个数,每个加个2100,从0开始,一分钟向上扩散1,最多不超过2100

struct node{
    int x;
    int y;
    int t;
};
int da[4][2]={1,0,-1,0,0,-1,0,1};
int n=2100;
int ma[10000][10000],vis[10000][10000];
queue<node> q;
void bfs(){
    mem(ma,0);
    mem(vis,0);
    node s,p;
    p.t=0,p.x=n,p.y=n;q.push(p);
    p.t=0,p.x=n+2000,p.y=n+2000;q.push(p);
    p.t=0,p.x=n+2020,p.y=n+11;q.push(p);
    p.t=0,p.x=n+11,p.y=n+14;q.push(p);
    vis[n][n]=vis[n+2000][n+2000]=vis[n+2020][n+11]=vis[n+11][n+14]=1;
    ll ans=4;
    while(!q.empty()){
        p=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            s.x=p.x+da[i][0];
            s.y=p.y+da[i][1];
            s.t=p.t+1;
            if(vis[s.x][s.y]==0&&s.t<=2020){
                vis[s.x][s.y]=1;
                ans++;
                q.push(s);
            }
        }
    }
    cout<<ans<<endl;
}
int main(){
    bfs();
    return 0;
}

答案:20312088


C阶层约数

【问题描述】
定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个约数。

思路:将它的每个因数分解,比如 5! = 1x2x3x4x5 = 23x31x51,
2就可以挑选0个、1个、2个、3个,同样3和5,那他的约数个数就是每个约数指数的乘积,相当于多少种方法
这个是看了这个博主
(当时差一点就想到了,没做出来,哎,可惜吖!)
代码:

int a[101];
int main(){
    mem(a,0);
    for(int i=2;i<=100;i++){
        int tem=i;
        for(int j=2;j<=i;j++){
            while(tem%j==0){
                tem/=j;
                a[j]++;
            }
        }
    }
    ll ans=1;
    for(int i=1;i<=100;i++)
        ans*=(a[i]+1);
    cout<<ans<<endl;
    return 0;
}

答案:39001250856960000


  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值