首页 > 代码库 > 第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
菜鸡只能报个B组。于是报了第六届的本科B。就找了上届的本科B的题来做做。
A:
标题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一个整数。请通过浏览器提交答案。 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
对于这种,我直接暴力了。
double a=2.3,b=1.9; FOR(j,0,SIZE) FOR(i,0,j) { if(abs(a*i+b*j-82.3)<=eps) { pf("%d %d\n",i,j); return 0; } }答案为 11 ,30 。
B:
标题:切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢? 答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
找到递归方程就好了。
f[n]=f[n-1]*2-1;
答案是 1025
C:
标题:李白打酒 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
ORZ 我还是暴搜的。反正又不卡时间。
不过需要注意的是 中途喝完的时候 然后不停的 0*2=0 这样是不行的。
答案是14。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<bitset> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,b) for(int i=a;i<b;i++) #define FOR_(i,a,b) for(int i=a;i>=b;i--) #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define mp make_pair #define ft first #define sd second #define sf scanf #define pf printf #define sz(v) ((int)(v).size()) #define all(v) (v).begin(),(v).end() #define acfun std::ios::sync_with_stdio(false) #define SIZE 10000 +1 using namespace std; int f=10,s=5; char a[16]; int ans=0; void dfs(int u,int i,int j,int k) { if(u==0&&i==0&&j==0) { if(a[14]=='a')return; ans++; FOR(p,0,15) pf("%c",a[p]); pf("\n"); } //pf("%d %d\n",i,j); if(i<0||j<0)return; a[k]='a'; dfs(u*2,i-1,j,k+1); a[k]='b'; dfs(u-1,i,j-1,k+1); } int main() { dfs(2,s,f,0); pf("\n%d\n",ans); }
D:
标题:史丰收速算 史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算! 速算的核心基础是:1位数乘以多位数的乘法。 其中,乘以7是最复杂的,就以它为例。 因为,1/7 是个循环小数:0.142857...,如果多位数超过 142857...,就要进1 同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n 下面的程序模拟了史丰收速算法中乘以7的运算过程。 乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。 乘以 7 的进位规律是: 满 142857... 进1, 满 285714... 进2, 满 428571... 进3, 满 571428... 进4, 满 714285... 进5, 满 857142... 进6 请分析程序流程,填写划线部分缺少的代码。 //计算个位 int ge_wei(int a) { if(a % 2 == 0) return (a * 2) % 10; else return (a * 2 + 5) % 10; } //计算进位 int jin_wei(char* p) { char* level[] = { "142857", "285714", "428571", "571428", "714285", "857142" }; char buf[7]; buf[6] = '\0'; strncpy(buf,p,6); int i; for(i=5; i>=0; i--){ int r = strcmp(level[i], buf); if(r<0) return i+1; while(r==0){ p += 6; strncpy(buf,p,6); r = strcmp(level[i], buf); if(r<0) return i+1; //if(r>0) return i; //______________________________; //填空 } } return 0; } //多位数乘以7 void f(char* s) { int head = jin_wei(s); if(head > 0) printf("%d", head); char* p = s; while(*p){ int a = (*p-'0'); int x = (ge_wei(a) + jin_wei(p+1)) % 10; printf("%d",x); p++; } printf("\n"); } int main() { f("428571428571"); f("34553834937543"); return 0; } 注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)
搞清楚就好了。 答案是: if(r>0) return i;
E:
标题:打印图形 小明在X星球的城堡中发现了如下图形和文字: rank=3 * * * * * * * * * rank=5 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ran=6 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 小明开动脑筋,编写了如下的程序,实现该图形的打印。 #define N 70 void f(char a[][N], int rank, int row, int col) { if(rank==1){ a[row][col] = '*'; return; } int w = 1; int i; for(i=0; i<rank-1; i++) w *= 2; //____________________________________________; //f(a, rank-1, row, col+w/2); f(a, rank-1, row+w/2, col); f(a, rank-1, row+w/2, col+w); } int main() { char a[N][N]; int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j] = ' '; f(a,6,0,0); for(i=0; i<N; i++){ for(j=0; j<N; j++) printf("%c",a[i][j]); printf("\n"); } return 0; } 请仔细分析程序逻辑,填写缺失代码部分。 通过浏览器提交答案。注意不要填写题目中已有的代码。也不要写任何多余内容(比如说明性的文字)
就是打印图形,很明显的看出其实就是 递归三份。
答案是 :f(a, rank-1, row, col+w/2);
第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。