最多有多少人参加比赛呢?
来源:互联网 发布:天天网络教育会计 编辑:程序博客网 时间:2024/04/20 18:38
已知一次比赛一共有四道题目,每道题目有A,B,C三个选项。当比赛结束之后阅卷人员发现,参赛者中任意三个人,都有一道题目,他们的答案互不相同。那么最多有多少人参加了比赛呢?
这道题目也颇有趣。我们假设有m个人参加了比赛。那么这些解答可以表示成一个4*m的矩阵,每一列从上到下写上A或B或C,表示那一题该选手选的结果。那么题目就翻译为任意三列,都可以找到一维(一个四行有四维),这三列在这一维互不相同。
一开始分析到上面,其实只不过把题目翻译了一下,更加直观,但还是没有实质的进展。后来发现,其实每一维之间是相互独立的。我们可以从维度入手,想象成每一维(行)都有一些三人组(三列)赋值不同,就好像这一维把这三个人区别开,如果某一维把某三列区别开,那么之后的其它维就不用管这三列,尽可能地赋值把其他三人组区别开,最终如果能把所有三人组区别开,那么就存在这样的方案。我们发现,m越大,要区分的三人组越多,而维数越多,能够区分的三人组越多,这道组合极值问题题就是在问给了维数之后能够区分多少人构成的三人组。
我们从简单情况分析,只有一维(也即只有一道题)的时候,显然最多有三个人,他们分别选A,B,C即可(如果四个人,由抽屉原理,有两个人该题选相同,那么再加上任何一个人,这三个人都无法被区别)。我们用f(n)表示维最多能够区分的人数。显然要考虑f(n+1)与f(n)的关系。仍然是抽屉原理,f(n+1)个人,在第一题有一个选项至多有[f(n+1)/3]人选,也就是至少有(f(n+1)-[f(n+1)/3])人,他们一共选了两种选项,这些人无法通过第一维区分,一定要通过下面n维区分。所以(f(n+1)-[f(n+1)/3])<=f(n). 也即f(n+1)*2/3<=f(n), 也即f(n+1)<=f(n)*3/2;
这样我们就找到了递推式,f(2)<=f(1)*3/2 => f(2)<=4 =>f(3)<=6 => f(4)<=9.下面要构造一种9个人的例子:
A A A B B B C C C
A B C A B C A B C
A B C B C A C A B
A B C C A B B C A
不难验证上述例子满足要求。
- 最多有多少人参加比赛呢?
- 百度笔试题-1001人参加羽毛球赛,淘汰赛,当比出第一时进行了多少场比赛
- 最多能喝多少瓶啤酒呢?
- 有多少种比赛方式
- Excel 最多可以有多少行
- foxmail的收件箱中最多能放多少邮件呢?
- excel最多能有多少行多少列
- 有多少人能注意到我呢
- 有多少程序员超过四十岁呢?
- excel2007有多少行?多少列?最多能建多少工作表?
- SQL Server 最多可以有多少张表
- linux环境下一个进程最多能有多少个线程?
- 集合A中最多有多少个元素
- windows系统文件夹下最多有多少个子文件
- hdu4635 有向图最多添加多少边使图仍非强连通
- 【LintCode】最多有多少个点在一条直线上
- LinkCode-最多有多少个点在一条直线上
- 最多有多少个点在一条直线上
- ubuntu下C++如何调用python程序,gdb调试C++代码
- 持续化集成Jenkins的系统配置+jenkins的构建项目配置
- 【今日头条】放出一大波职位!!!
- 【转载】《JAVA与模式》之原型模式
- preg_replace引发的phpmyadmin(4.3.0-4.6.2)命令执行漏洞
- 最多有多少人参加比赛呢?
- easy ui扩展
- Linux系统命令大全
- 译.C++的5个迷思
- python学习(1)
- 数据库设计三大范式
- 如何编写更好的SQL查询:终极指南-第二部分
- Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议
- Java集合类详解