您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-08 16:24 162 查看
5200

上面是我的答案

可以直接手算,但容易出错。

或者复制题目给的数据,稍微修改并格式化,放到文本文档中,不管是运行后复制数据,还是用io重定向,都要比手算方便。

比赛的时候freopen的前两个参数写反了,一直读不进去

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;
}


好像是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;
}


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

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;
}


f(x/10,k)

a[i-1][j-1]+1

模拟一下就好,最后排一下序。

dp或者母函数暴一下,应该能过一部分数据

没看懂

数据范围记不太清了,这样应该可以,至少比枚举复杂度低

#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;
}


以上答案仅供参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: