2019蓝桥国赛

A 签到题

#include<bits stdc++.h>
using namespace std;
#define ll long long
int main(){
    for(int i=2020;;++i){
        for(int j=i+1;;++j){
            if(i*i-2019*2019==j*j-i*i){
                cout << i + j ;
                return 0;
            }
            else if(i*i-2019*2019<=j*j-i*i) break;
        }
    }
    return 0;
} 

B 背包是一定体积内的最大价值(不需装满),装箱是刚好等于箱子体积的方案数(要装满)

#include<bits stdc++.h>
using namespace std;
#define ll long long
int const N=3e3+7;
int cnt;
int p[N],vis[N];
ll f[N];
int main(){
    for(int i=2;i<=2019;++i){
        if(vis[i]==0){
            for(int j=i+i;j<=2019;j+=i){
                vis[j]=1;
            }
            p[++cnt]=i;
        }
    }
    f[0]=1;
    for(int i=1;i<=cnt;++i){
        for(int j=2019;j>=p[i];--j){
            f[j]+=f[j-p[i]];    //加上前一步的方案数
        }
    }
    cout << f[2019];    
    return 0;
} 

C

参考博客

以对角线为起点,以左右边界为终点切割

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int vis[17][17],ans;
int xx[]={0,1,0,-1};
int yy[]={1,0,-1,0};
void dfs(int x,int y){
    if(x==0||y==7){
        ans++;
        return ;
    }
    for(int i=0;i<4;++i){
        int dx=x+xx[i];
        int dy=y+yy[i];
        if(dx<=7&&dx>=0&&dy<=7&&dy>=0&&!vis[dx][dy]&&dx!=dy){
            vis[dx][dy]=vis[dy][dx]=1;
            dfs(dx,dy);
            vis[dx][dy]=vis[dy][dx]=0;
        } 
    }
}
int main(){
    for(int i=0;i<=7;++i){
        memset(vis,0,sizeof vis);
        vis[i][i]=1;
        dfs(i,i);
    }
    cout << ans;
    return 0;
}

D 签到题

暴力就好

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans;
int pan(int x){
    ll cnt=0;
    for(int i=1;i<=x;++i){
        if(x%i==0) cnt++;
    }
    if(cnt==100) {
        ans=x;return 1;
    }
    return 0;
}
int main(){
    for(int i=100;;++i){
        if(pan(i)) break;
    }
    cout << ans ;
    return 0;
} 
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 18:03
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务