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

来源:互联网 发布:usb端口检测工具 编辑:程序博客网 时间:2024/05/16 00:46
  1. 5200

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

  2. 210

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

#include<cstdio>#include<cstring>#define LL long long#define MAX 10000bool 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 100000using 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;}

以上答案仅供参考

0 0
原创粉丝点击