Try第十一届蓝桥杯

 第十一届蓝桥杯

B 扩散

 首先考虑到bfs,但最终选择建立矩阵图、逐个染色+扫描,因为这相对前者省空间且易实现。

ans:20312088

 1 #include<bits/stdc++.h>
 2 #define N 10000
 3 using namespace std;
 4 bool flg[N][N];
 5 long long ans;
 6 int a[4][2]={2020,2020,
 7             4040,2031,
 8             2031,2034,
 9             4020,4020};
10 
11 void work(int x,int y){
12     for(int i=0;i<=2020;i++)
13         for(int j=2020-i;j>=0;j--){
14             flg[x+i][y+j]=1;
15             flg[x-i][y+j]=1;
16             flg[x+i][y-j]=1;
17             flg[x-i][y-j]=1;
18         }
19 }
20 
21 int main(){
22     for(int i=0;i<4;i++)
23         work(a[i][0],a[i][1]);
24     for(int i=0;i<=6060;i++)
25         for(int j=0;j<=6060;j++)
26             if(flg[i][j])
27                 ans++;
28     cout<<ans;
29     return 0;
30 }

C 阶乘约数

参考大佬  C题 - 阶乘约束 - 唯一分解定理 - 抓水母的派大星 - 博客园   %%%膜!

ans:39001250856960000

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long ans=1;
 4 int a[110];
 5 
 6 void work(){
 7     for(int i=2;i<=100;i++){
 8         int t=i;
 9         for(int j=2;j<=t/j;j++){
10             for(;t%j==0;t/=j)
11                 a[j]++;
12         }
13         if(t>1)a[t]++;
14     }
15 }
16 
17 int main(){
18     work();
19     for(int i=2;i<=100;i++)
20         if(a[i])
21             ans*=(a[i]+1);
22     cout<<ans;
23     return 0;
24 }

D 本质上升序列

参考大佬   本质上升序列-python-anderson13的博客  %%%膜!

ans:3616159

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 200
 4 long long dp[210],ans;
 5 char a[210];
 6 
 7 int main(){
 8     cin>>a;
 9     for(int i=0;i<N;i++){
10         dp[i]=1;
11         for(int j=0;j<i;j++)
12             if(a[j]<a[i])
13                 dp[i]+=dp[j];
14             else if(a[j]==a[i])
15                 dp[i]-=dp[j];
16         ans+=dp[i];
17     }
18     cout<<ans;
19     return 0;
20 }

不是!哎呀我要裂开了啊,我这oier退役后啥都不会了

        

我 好 菜 啊     这也太难了

E 玩具蛇

哇  Finally,终于有个会写的暴力了,dfs。

ans:552

#include<bits/stdc++.h>
using namespace std;
long long ans;
bool b[5][5];
int dr[4][2]={    {-1,0},
             {0,-1},{0,1},
                {1,0}};

void dfs(int x,int y,int t){
    if(t==16){
        ans++;
        return;
    }
    int x2,y2;
    b[x][y]=1;
    for(int i=0;i<4;i++){
        x2=x+dr[i][0];
        if(x2<=0 || x2>4)
            continue;
        y2=y+dr[i][1];
        if(y2<=0 || y2>4)
            continue;
        if(!b[x2][y2])
            dfs(x2,y2,t+1);
    }
    b[x][y]=0; 
}

int main(){
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            dfs(i,j,1);
    cout<<ans;
    return 0;
}

 

F 皮亚诺曲线距离

 递归

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll POW[110];

ll calc(int k,ll x,ll y){
    if(!k)
        return 0;
    ll a,b;
    a=POW[k-1]*POW[k-1];
    b=POW[k-1];
    if(x<=b){
        if(y<=b){
            return calc(k-1,x,y);
        }
        else if(y<=b*2){
            return a+calc(k-1,b+1-x,y-b);
        }
        else{
            return a*2+calc(k-1,x,y-b*2);
        }
    }
    else if(x<=b*2){
        if(y<=b){
            return a*5+calc(k-1,x-b,b+1-y); 
        }
        else if(y<=b*2){
            x-=b,y-=b;
            return a*4+calc(k-1,b+1-x,b+1-y);
        }
        else{
            y-=b*2;
            return a*3+calc(k-1,x-b,b+1-y);
        }
    }
    else{
        if(y<=b){
            return a*6+calc(k-1,x-b*2,y);
        }
        else if(y<=b*2){
            x-=b*2;
            return a*7+calc(k-1,b+1-x,y-b);
        }
        else{
            return a*8+calc(k-1,x-b*2,y-b*2);
        }
    }
}

int main(){
    ll a,b,k,x1,y1,x2,y2;
    cin>>k>>x1>>y1>>x2>>y2;
    x1++;
    x2++;
    y1++;
    y2++;
    POW[0]=1;
    for(int i=1;i<=k;i++)
        POW[i]=POW[i-1]*3;
    a=calc(k,x1,y1);
    b=calc(k,x2,y2);
    cout<<abs(a-b);
    return 0;
}

 

原文地址:https://www.cnblogs.com/1227xq/p/14791925.html