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

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

[复制链接]
发表于 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-5-18 19:01 , Processed in 0.055776 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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