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

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/define_danmu_primer/article/details/69676841
  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;
}

#以上答案仅供参考

猜你喜欢

转载自blog.csdn.net/define_danmu_primer/article/details/69676841