没有合适的资源?快使用搜索试试~ 我知道了~
2018蓝桥杯C语言b组国赛真题
资源推荐
资源详情
资源评论
2018 蓝桥杯C 语⾔b组国赛真题
1.标题:换零钞
x星球的钞票的⾯额只有:100元,5元,2元,1元,共4种。
⼩明去x星旅游,他⼿⾥只有2张100元的x星币,太不⽅便,恰好路过x星银⾏就去换零钱。
⼩明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,
剩下的当然都是5元⾯额的。
银⾏的⼯作⼈员有点为难,你能帮助算出:在满⾜⼩明要求的前提下,最少要换给他多少张钞票吗?
(5元,2元,1元⾯额的必须都有,不能是0)
注意,需要提交的是⼀个整数,不要填写任何多余的内容。
⼿算都可以。。。下⾯是代码,答案74
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<40;i++){
for(int j=1;j<200;j++){
if(5*i+2*10*j+1*j==200) if(5*i+2*10*j+1*j==200)
⼀共⼀共 张张
}
}
return 0;
}
2.标题:激光样式
x星球的盛⼤节⽇为增加⽓氛,⽤30台机光器⼀字排开,向太空中打出光柱。
安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!
国王很想知道,在⽬前这种bug存在的情况下,⼀共能打出多少种激光效果?
显然,如果只有3台机器,⼀共可以成5种样式,即:
全都关上(sorry, 此时⽆声胜有声,这也算⼀种)
开⼀台,共3种
开两台,只1种
30台就不好算了,国王只好请你帮忙了。
要求提交⼀个整数,表⽰30台激光器能形成的样式种数。
注意,只提交⼀个整数,不要填写任何多余的内容。
思路很简单,暴⼒搜索,30个灯光从左到右,从左边第⼀个开始,第⼀个可以开关,第⼆个要根据左边的灯光是否开启来取值,以此类
推。。。 答案2178309
#include<iostream>
#include<string.h>
using namespace std;
int ans = 0;
int x[31];//0代表关,1代表开
void dfs(int index){
if(index == 30){
ans++;
return;
}
if(index == 0 || x[index-1] == 0){ //第⼀个灯光可以取0或1,当前灯光左边要是没开,那当前灯光可以取0和1
for(int i=0;i<=1;i++){
x[index] = i;
dfs(index+1);
x[index] = 0;
}
}
else{ //左边的灯光开了,那当前灯光只能关闭(取0)
dfs(index+1);
}
}
int main(){
memset(x,0,31*sizeof(int));
dfs(0);
cout<<ans<<endl;
return 0;
}
3.标题:格雷码
格雷码是以n位的⼆进制来表⽰数。
与普通的⼆进制表⽰不同的是,它要求相邻两个数字只能有1个数位不同。
⾸尾两个数字也要求只有1位之差。
有很多算法来⽣成格雷码。以下是较常见的⼀种:
从编码全0开始⽣成。
当产⽣第奇数个数时,只把当前数字最末位改变(0变1,1变0)
当产⽣第偶数个数时,先找到最右边的⼀个1,把它左边的数字改变。
⽤这个规则产⽣的4位格雷码序列如下:
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
以下是实现代码,仔细分析其中逻辑,并填写划线部分缺少的代码。(答案:a^((a&(-a))<<1))
别看代码转来转去很复杂,其实a的取值就是格雷码序列,这⾥提⼀下a&-a的作⽤:⼆进制数低位连续的0加上⼀个1组成的数,⽐如
a=12(1100),低位连续的0有两个,那么a&-a=4(100)。题⽬要求当产⽣第偶数个数时候改变最右边的1的左边的数,即0001-
>0011,0010->0110,0111->0101,0100->1100,1101->1111,1110->1010,1011->1001,那么a&-a起作⽤了,我们求
到了低位连续的0加上⼀个1组成的数,让它左移⼀位,然后再与a异或,1^1=0,1^0=1,这样就达到⽬的了。
剩余10页未读,继续阅读
资源评论
w360366
- 粉丝: 180
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功