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

  • Post author:
  • Post category:其他



先存个样~~之后补全



个人解法,可能不是最佳,欢迎指错


小总结,第一次参加总得来一个国二,

(但我还是很菜)


下面是自己习惯性用的头文件

#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 = 2

3

x3

1

x5

1

,

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




版权声明:本文为Z28_99原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。