蓝桥杯2018年国赛试题解题报告

x星球的钞票的面额只有:100元,5元,2元,1元,共4种。小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元张数的10倍,剩下的当然都是5元面额的。银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?(5元,2元,1元面额的必须都有,不能是0) 思路:直接模拟即可,注意是求最少的钞票数,不要只算某种钞票

//5元
for(int i=1; i*5

x星球的盛大节日为增加气氛,用30台激光器一字排开,向太空中打出光柱。安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?
显然,如果只有3台激光器,一共可以成5种样式,即:
全都关上(sorry, 此时无声胜有声,这也算一种)
开一台,共3种
开两台,只1种
30台就不好算了,国王只好请你帮忙了。要求提交一个整数,表示30台激光器能形成的样式种数。
思路:
1.DFS

int dfs(int now,int lim) {
    if(now==lim)    return 1;
    int res=0;
    if(now==0||!vis[now-1]) {
            vis[now]=1;
        res+=dfs(now+1,lim);
    }
    vis[now]=0;
    res+=dfs(now+1,lim);
    return res;
}

2.位运算

if(n=0; i-=2)    maxn+=(1<0) {
    if((n&(n>>1))==0)    res++;
    n--;
}

格雷码是以n位的二进制来表示数。与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同,首尾两个数字也要求只有1位之差。
有很多算法来生成格雷码,以下是较常见的一种:
从编码全0开始生成,当产生第奇数个数时,只把当前数字最末位改变(0变1,1变0);当产生第偶数个数时,先找到最右边的一个1,把它左边的数字改变。用这个规则产生的4位格雷码序列如下:
(略)
以下是实现代码,仔细分析其中逻辑,并填写划线部分缺少的代码。

#include
void show(int a, int n) {
    int msk = 1 << (n-1);
    for (int i = 0; i < n; i++) {
        putchar((a & msk) ? '1' : '0');
        msk = msk >> 1;
    }
    putchar('\n');
}

void f(int n) {
    int num = 1 << n;
    int a = 0;
    for (int i = 0; i < num; i++) {
        show(a, n);
        if (i % 2 == 0) {
            a = a ^ 1;
        } else {
            // a = _________________________ ; //填空
        }
    }
}

int main() {
    f(4);
    return 0;
}

思路:先了解异或运算的一个性质:将一个整数的某位异或1实现反转该位,异或0实现保留该位。取出最低位的前一位(a&(-a))<

Original: https://www.cnblogs.com/m0-51303687/p/16284758.html
Author: m0_51303687
Title: 蓝桥杯2018年国赛试题解题报告

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604935/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球