解题思路:

注意事项:

参考代码:

#include<stdio.h>

int main()

{

    int i=0,n[64],a,b,c,d,e,f,z=0;

//i是控制用的变量;n[]表示各种情况,数组长度取决于变量数量,为2的指数;a,b,c,d,e,f只是为了看起来方便.

//z是在不知道可能解数量的情况下,为了记录人数选出最优解设的变量.

    while(i<=63)

    {

        n[i]=i;//i从0开始,数组依次放置0到63

        a=(n[i]/32)%2;//如果i<=31,意味着n[i]/32=0(设的是整形),那么a一定为0;如果i>=32,那么n[i]/32一定是一点几,取1,意味着a一定为1

        b=(n[i]/16)%2;//除数是16意味着求有几个16,对2求余得奇数或偶数.因为a有所不同,所以b相同时可能有多种情况

        c=(n[i]/8)%2;//下方规则相同

        d=(n[i]/4)%2;

        e=(n[i]/2)%2;

        f=n[i]%2;

        if(a+b<1||a+d>1||a+e+f!=2||b+c==1||c+d!=1||e>d)//这是满足要求的条件

        {

            n[i]=64;//不满足要求就让它为64,如果满足要求就保留原值(0-63)

        }

        else if(z<a+b+c+d+e+f)

        {

            z=a+b+c+d+e+f;//因为我们要求最优解,即人数最多的解,所以把人数记录下来,1是去,0是不去,和越大去的人越多.

        }

        else

        {

            n[i]=64;//如果后续的解不如之前的解,那就没必要留着了,但同时之前留着的不是最优解的解还在,这里偷懒一下,没把之前那些不是最优解的解去掉

        }

        i=i+1;

    }

    i=0;

    while(i<=63)

    {

        if(n[i]!=64&&(n[i]/32)%2==1) printf("A,");//去一个输出一个

        if(n[i]!=64&&(n[i]/16)%2==1) printf("B,");

        if(n[i]!=64&&(n[i]/8)%2==1) printf("C,");

        if(n[i]!=64&&(n[i]/4)%2==1) printf("D,");

        if(n[i]!=64&&(n[i]/2)%2==1) printf("E,");

        if(n[i]!=64&&n[i]%2==1) printf("F,");

        if(n[i]!=64) printf("\n");//本题只有一个解,但如果有多个解可以换行输出

        i=i+1;

    }

return 0;

}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论