找回密码
 欢迎注册
楼主: 东邪

[讨论] 有多少人参加考试

[复制链接]
发表于 2009-7-15 09:28:44 | 显示全部楼层
排了半天也只排出个13人的解…… 如下: A, C, C, B, A, A B, B, B, C, C, A C, A, A, A, B, A C, A, C, C, B, C B, B, B, B, B, B A, B, A, A, B, B B, C, B, C, B, C C, C, A, A, C, B B, A, A, C, A, B A, A, B, C, C, C C, B, B, A, A, C B, B, C, A, C, B C, A, A, B, C, C
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-15 12:17:32 | 显示全部楼层
难道答案真是13人么?排不出14人的了……
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-15 16:25:30 | 显示全部楼层
发现可以建立一个网格覆盖的模型。。。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-15 16:34:17 | 显示全部楼层
有三种答案,那么应该是立体空间格覆盖^^ 技巧发现多了可以组织成理论,嘿嘿
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-16 16:14:40 | 显示全部楼层
14# nlrte13 兄弟,讲透彻点啊,让俺学习一下
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-17 08:22:56 | 显示全部楼层
本帖最后由 nlrte13 于 2009-7-17 14:50 编辑
14# nlrte13 兄弟,讲透彻点啊,让俺学习一下 shshsh_0510 发表于 2009-7-16 16:14
换一种思路,先不考虑有几道题目,而是考虑有多少人考试。 如果有N人参加考试,那么需要覆盖C(3, N)个格子。 若N能被3整除,对于第一道题目来说,最多能覆盖( N / 3 )^3 个格子; 若余数为1,对于第一道题目来说,最多能覆盖( N / 3 )^2 * ( 1 + N / 3 )个格子; 否则,对于第一道题目来说,最多能覆盖( N / 3 ) * ( 1 + N / 3 )^2 个格子; 这三种情况,必然有 [ ( C(3, N)-1 )/3 ] + 1 个重复的 A或B或C,这也是最小重复的情况。 在不考虑和第一题重复覆盖,第二道题目亦是如此。 每一题相当于若干“块”的集合,考虑重复覆盖的情况下,用最少的“块”集覆盖满 C(3, N)个格子。 对任意N>0, 第一题之后,若 [ ( C(3, N)-1 )/3 ] + 1 不等于 1,说明还有重复覆盖,需要有后一题来解决 在最优的情况,令 n1 = [ ( C(3, N)-1 )/3 ] + 1,第二题使得剩余重复覆盖 = [ ( n1-1 )/3 ] + 1 如此迭代下去,直到剩余重复覆盖数 = 1。那么迭代次数就等于满足N人任取3人能有一题不重复的最小题目数。 用计算机编程迭代以下,很快可以得到,N=13时,通过6次迭代使得n7 = 1; N=14时,通过7次迭代使得n8=1。 所以13人参加已是最多的,14人至少需要7题。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-17 17:24:48 | 显示全部楼层
突然想到一个更好的模型,不过只是刚有一点萌芽^^ 待俺再好好想想
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-17 18:03:32 | 显示全部楼层
呵呵,能否给出一个估计.... 或者一个递推关系??
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-21 15:22:19 | 显示全部楼层
我想的第二种方法和第一种结果竟然不一样,第二种方法算出最多可以有19人。 初步感觉应该是第一种方法错了,可是手工排太难排了,始终没排出超过13人的。 明天或者后天我把代码发上来^^
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-7-21 15:44:42 | 显示全部楼层
程序还是比较简单的,几行就搞定,先贴出来了: int fun( int n ) { if( n < 3 ) return 0; int iRet = 0; while( n > 2 ) { n = n / 3 * 2 + n % 3; ++iRet; } return iRet; } int main( void ) { for( int n = 0; n < 730; ++n ) { if( fun( n ) > 6 ) break; } return n - 1; }
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 06:13 , Processed in 0.025054 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表