第八届蓝桥杯大赛c/c++ b组

本文总结了算法竞赛中的实用技巧,包括素数判断、动态规划、路径搜索等,并提供了具体实现代码示例。
  1. 5200

上面是我的答案
可以直接手算,但容易出错。
或者复制题目给的数据,稍微修改并格式化,放到文本文档中,不管是运行后复制数据,还是用io重定向,都要比手算方便。
比赛的时候freopen的前两个参数写反了,一直读不进去

  1. 210

比赛的时候没想清楚怎么搜

#include<cstdio>
#include<cstring>
#define LL long long
#define MAX 10000
bool isprime[MAX];
int prime[MAX],cnt;
void doprime(){
    cnt=0;
    memset(isprime,true,sizeof(isprime));
    isprime[0]=isprime[1]=false;
    for(LL i=2;i<=MAX;++i){
        if(isprime[i]){
            prime[cnt++]=i;
            for(LL j=i*i;j<=MAX;j+=i)//i是int可能溢出
                isprime[j]=false;
        }
    }
}
int main(){
    doprime();
    for(int i=1;;++i){
        int j;
        for(j=0;j<cnt;++j){
            int k;
            int tmp=prime[j];
            for(k=0;k<10;++k){
                if(!isprime[tmp])
                    break;
                tmp+=i;
            }
            if(k>=10) break;
        }
        if(j<cnt){
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}
  1. 好像是7开头的一个挺大的数
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double a[40][40];
int data;    //电子秤的最小示数
int main(){
    for(int i=1;i<=29;++i){
        for(int j=1;j<=29;++j){
            scanf("%lf",&a[i][j]);
            if(j>1) a[i][j]+=a[i-1][j-1]/2;
            if(j<i) a[i][j]+=a[i-1][j-1]/2;
        }
    }
    printf("%f\n",data/(a[29][29]/2)*max((a[29][14]+a[29][15])/2,(a[29][16]+a[29][17])/2));
    return 0;
}

比赛时的代码没最后的比较,不知道能不蒙对

  1. 216

要想满足分成两部分并且两部分相同,对应的条件是分割线没有经过同一个点和分割线关于(3,3)点中心对称,所以从(3,3)点出发遍历所有路径,路径数再除以2 就是答案

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dir[4][2]={-1,0,0,1,1,0,0,-1};
bool vis[10][10];
int ans;
bool check(int x,int y){
    return x>=1&&x<=6&&y>=1&&y<=6;
}
void dfs(int x,int y){
    if(x==1||x==6||y==1||y==6){
        ++ans;
        return;
    }
    for(int i=0;i<4;++i){
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(check(xx,yy)&&!vis[xx][yy]&&!vis[6-xx][6-yy]){
            vis[xx][yy]=true;
            dfs(xx,yy);
            vis[xx][yy]=false;
        }
    }
}
int main(){
    vis[3][3]=true;
    dfs(3,3);
    printf("%d %d\n",ans,ans/2);
    return 0;
}
  1. f(x/10,k)
  2. a[i-1][j-1]+1
  3. 模拟一下就好,最后排一下序。
  4. dp或者母函数暴一下,应该能过一部分数据
  5. 没看懂
  6. 数据范围记不太清了,这样应该可以,至少比枚举复杂度低
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 100000
using namespace std;
int dp[MAX+10][100];
int main(){
    int n,k;
    int tmp;
    int ans=0;
    memset(dp,0,sizeof dp);
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i){
        scanf("%d",&tmp);
        ++dp[i][tmp%k];
        for(int j=0;j<k;++j){
            dp[i][(j+tmp)%k]+=dp[i-1][j];
        }
    }
    for(int i=1;i<=n;++i)
        ans+=dp[i][0];
    printf("%d\n",ans);
    return 0;
}

#以上答案仅供参考

### 关于第十五届蓝桥杯2024 C/C++ A大学软件赛的信息 #### 比赛题目概述 根据已有的信息,第十五届蓝桥杯软件赛C/C++大学A的比赛题目尚未完全公开。然而,在某些参赛者的分享中提到,部分试题涉及算法设计与优化[^1]。例如,“合法密码”问题是其中的一道典型考题,其核心在于字符串处理和合法性验证逻辑的设计[^2]。 #### 时间复杂度的要求 对于一些具体问题,如图论相关的内容,时间效率成为评判标准之一。有记录显示,针对特定类型的输入数据结构(比如边的关系),即使采用较为基础的双重循环实现方法,也能满足竞赛设定的时间限制——通常为3秒以内完成运算[^3]。 #### 参加者的学习计划建议 为了更好地备战此类赛事,一位昵称为“牛友”的选手提出了自己的学习规划:利用假期集中精力复习数学基础知识,并通过参与各类线上编程挑战来积累实战经验,目标是从当前学科成功转换至计算机科学领域继续深造。 ```cpp // 示例代码片段展示如何判断简单条件下的合法密码 bool isValidPassword(const std::string& password){ bool hasUpper = false; bool hasLower = false; bool hasDigit = false; if(password.length() < 8 || password.length() > 16) return false; for(char c : password){ if(isupper(c)) hasUpper=true; else if(islower(c)) hasLower=true; else if(isdigit(c)) hasDigit=true; // 假设不允许特殊字符作为简化版规则的一部分 if(!isalnum(c)) return false; } return (hasUpper && hasLower && hasDigit); } ``` 上述函数仅为示意性质,实际比赛中可能需要考虑更复杂的约束条件以及边界情况测试。 #### 总结 综上所述,参加蓝桥杯这样的高水平程序设计大赛不仅考验选手的技术功底,还需要合理安排训练周期并不断调整策略适应新变化。希望每位热爱编码的人都能在这一过程中收获成长!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值