一道竞赛题

/**

* A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束
* 1. 如果A参加,B也参加;
* 2. 如果C不参加,D也不参加;
* 3. A和C中只能有一个人参加;
* 4. B和D中有且仅有一个人参加;
* 5. D、E、F、G、H 中至少有2人参加;
* 6. C和G或者都参加,或者都不参加;
* 7. C、E、G、I中至多只能2人参加

* 8. 如果E参加,那么F和G也都参加。

* 9. 如果F参加,G、H就不能参加
* 10. 如果I、J都不参加,H必须参加

* 打印所有满足条件的情况~

*/

我的思路是:

10名同学,每人要么参加,要么不参加,所以一共有2的10次方即1024种的可能性,

那么我们可以用0到1024的二进制表示所有可能,如11 1111 1111 表示所有同学都参加了,

我们然后遍历所有可能,进行筛选,最后将结果转换成字符

代码如下:

public static void main(String[]args){
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<1024;i++){
            if(((i>>9)&1)==1&&((i>>8)&1)!=1){
                continue;
            }
            if(((i>>7)&1)==0&&((i>>6)&1)!=0){
                continue;
            }
            if(((i>>9)&1)*((i>>7)&1)==1){
                continue;
            }
            if((((i>>8)&1)+((i>>6)&1))==0||(((i>>8)&1)+((i>>6)&1))==2){
                continue;
            }
            if((((i>>6)&1)+((i>>5)&1)+((i>>4)&1)+((i>>3)&1)+((i>>2)&1))<2){
                continue;
            }
            if((((i>>7)&1)+((i>>3)&1))==1){
                continue;
            }
            if(((i>>5)&1)==1&&(((i>>4)&1)==0||((i>>3)&1)==0)){
                continue;
            }
            if(((i>>4)&1)==1&&(((i>>3)&1)==1|((i>>2)&1)==1)){
                continue;
            }
            if(((i>>6)&1)==0&&((i>>6)&1)==0&&((i>>6)&1)==0){
                continue;
            }
            list.add(i);

        }
        System.out.println("size()======"+list.size());
        for(int i=0;i<list.size();i++){
            String s = Integer.toBinaryString((Integer) list.get(i));
            for(int j=9;j>-1;j--){
                if(((list.get(i)>>j)&1)==1){
                    System.out.print((char)(‘I‘-j+1));
                }
            }
            System.out.println();
        }
    }

运行结果:

size()======8
CDG
CDGJ
CDGI
CDGIJ
CDGH
CDGHJ
CDGHI
CDGHIJ

如果有其他好方法,欢迎分享~

一道竞赛题,布布扣,bubuko.com

时间: 2024-12-10 09:59:19

一道竞赛题的相关文章

解题报告:LeetCode The Skyline Problem(画天际

题目出处:https://leetcode.com/submissions/detail/47013144/题意描述: 给定一系列矩形的左边坐标Li,右边坐标Ri,和高度Hi(其中Li按照从小到大的顺序排列).代表城市中一座座高楼.求这些矩形代表的高楼行成的天际线.天际线的定义为:在远处看这些所有的高楼时看到的轮廓. 数据输入: [ [L1, R1, H1], [Li, Ri, Hi]...]为元素类型为三维向量的向量,其中Li,Ri,Hi的含义见题意描述.且输入数据保证: 0 ≤ Li, Ri

圆内接多边形面积最大值问题之探究: 从一道加拿大数学竞赛题谈起

1. 一道数学奥林匹克竞赛题: 给定半径为 $r$ 的圆上定点 $P$ 的切线 $l$, $R$ 是该圆上动点, $RQ\perp l$ 于 $Q$, 试确定面积最大的 $\triangle{PQR}$. (第13届加拿大数学奥林匹克竞赛) 解答: 本题难度不大, 只需考虑在 $\bigodot{O}$ 内找到与 $\triangle{PQR}$ 相关的三角形即可. 过 $R$ 作 $RS \parallel l$ 交 $\bigodot{O}$ 于 $S$, 作 $PM \perp RS$.

关于js数组的一道小考题

网上看到的一道关于js数组的小考题,借此学习练习一下,也是拿来作为博客开篇之作吧! 题目如下: 给定一个随机数组,数组可能包含数组(也就是说数组元素可能为数组).要求用js实现一个函数,返回该数组中所有元素,重复的要求去掉.例如:数组[2,3,[4,6,[3,8]],12,10],返回结果为:[2,3,4,6,8,12,10]. 我的答案如下:(额外增加了排序) 1 var arr = [2,3,[4,6,[3,8,[15,16,[17,18,[1,2,3,[19,20]]]]],[13,14]

一道SQL的面试题之联想

一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给我们亮了一道SQL题目,非他之手,据出此题者说,如果面试者只能写出一种方法,基本可以pass.请读者仔细看题: 题目:如下表,用一条select语句求出所有课程在80分(含80分)以上的学生姓名,请写出所有可行方案.(注意:表名为sc,字段为name,kc,score) 这道题目并不陌生吧,相信大家

关于定义顺序和内存分配的关系--记一道不严谨的C语言题

include<stdio.h> #include<iostream> int main() { char a[] = "123"; char b[] = "abcd"; if (a > b) { printf("a>b \n"); } else printf("a<b\n"); printf("%p\n %p\n", a, b); system("pau

每天一道Java题[11]

题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synchronized关键字包裹需要保证线程安全的代码块,来实现线程同步.语法格式为: Synchronized(expression){ //需同步的代码 } <每天一道Java题[10]>中的MyRunnableThread类修改为: package me.huangzijian; public cl

每天一道Java题[3]

问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.equals()方法与hashCode()方法的关系如下: 如果两个对象的hashCode()返回值不一样,则equals()返回的结果必为false. 如果两个对象的hashCode()返回值一样的时候,equals()返回的结果未知. 如果两个对象的equals()返回的结果为true,则两个对象的hashC

一道有趣的数学题

班主任给了我一道数学题: 求证an都能表示成两个自然数的平方和. [分析] 不会就打表(OI后遗症) 那么我们发现an的第2个平方在an+1出现在了第一个(按从小到大) 这个就很py了啊,再看看第二个有啥关系..咦好像是比两倍多一点,多多少呢?咦,1.3.7.17--这不就是我找的那个规律了吗 啊我们就能猜想: 然后我们归纳一波 对于n<=5显然成立(上表),对于n>=6: 假设对于n=i成立,那么就有 目标:证明下式成立 这是啥呢?令A'=B,B'=A+2B,代入即可. 剩下的故事啊就是把递

一道很有意思的数学题

题目:某个家庭中有2个小孩,已知其中一个是女孩,则另一个是女孩的概率是多少? 答案:1/3 今天上概率课,想起了高中的这一道数学题.当初在高中对这个答案真的是百思不得其解,始终认为是1/2.生男生女和另一个孩子的性别有什么必然的联系吗?最后迫于升学的压力,不能任性啊~!!!只得背过答案,碰到前后性别不一样,就是2/3,一样就是1/3. 今天想起来,在百度上的找了好多关于这个问题理解,虽然有说1/3的,有说1/2的,但是仔细观察后发现,其实关于各种答案的问题描述还是有细微的差别的.最后在这里: 一