英特尔® 线程挑战赛(关注 问题集)

http://softwarecontests-zho.intel.com/threadingchallenge/

1、房间分配

    问题描述:假定有若干间宿舍,每个房间住两名学生,要对学生兴趣进行调查,根据学生兴趣来安排志趣相投的学生同住,以尽量使所有学生能够和睦相处。

对学生进行一次包含 50 个问题的调查。每个问题的答案都有五种同意程度,其分值范围从强烈反对(0 分)到强烈同意(4 分)。评估任意一对学生间不和谐程度的计算方法是:比较两人对 50 个调查问题的答案,并汇总不同答案所对应的同意程度分值差的绝对值。然后将得到的总和统一除以 200.0(即可能的最大差异分值总和)。所有假定房间分配的总不和谐程度(TD)值是所有学生对之间的不和谐程度值总和。因此,这个程序的目的就是通过测试宿舍中学生的不同配对来最小化 TD 值。

这个问题的输入内容将是一个文本文件。这个文件的第一行将是要分配宿舍的学生总数(N),后面跟有 N 个学生行。文件中的学生数N将是一个小于 2^28 - 1 的偶数,并且所有输入数据将装入目标平台的主内存中。文件中学生行的格式将是:由 10 个字符组成的标识字符串,1 个空格,再加一个 50 位的调查字符串。调查字符串的元素值范围为 0 到 4。

这些行的初始排列将决定初始的室友配对。最前面的两名学生将被视为分配到同一个房间,接下来的两名学生也分配到另一个房间,依此类推。

输入文件示例:

http://blog.chinaunix.net/u/24478/showart_450028.html

2
ChukECheez 01230230420314203422301230230420332023410123023042
Clyde Ruth 20342230123023042031420342230123042031420342233042

此示例文件的总不和谐程度(TD)临界值为 0.305。

代码限制:主程序必须采用以下结构:

InputDataFromFile(Rooms, N);
first = EvaluateRooms(Rooms, N);
print("The initial Disharmony is", first);
start = GetTime;
ComputeRoomAssignments(Rooms, N);
end = GetTime;
print("Time to compute room assignments is ", end - start, "seconds");
final = EvaluateRooms(Rooms, N);
print("Final Disharmony is", final);
PrintRoomAssignmentToFile(Rooms, N);

亦即:输入数据,计算并打印初始总不和谐程度(TD)评估值,开始计时,计算 TD 评估值较低的房间分配,停止计时,打印计算所用的时间,计算并打印最终分配所对应的 TD 评估值,然后将最终分配的标识字符串(一行一个标识)打印到输出文件。此处显示的具体函数名或变量名并非必需。

算法限制:由于解决此类问题的直接方法可能不可靠,并且随着学生人数的增加,各种分配组合的数量将呈几何级剧增,因此程序代码必须使用一些迭代的全局优化技巧,例如模拟退火算法(Simulated Annealing)。

时间限制:运行时的执行时间将限制在 2 分钟以内。亦即:假如运行时间超过120秒,应用程序无法向接收点报告。

输入文件:Students.in

输出文件:Assignments.out 

 

2、生命游戏

问题描述:Conway 的“生命游戏”是一款模拟生物体在矩形网格中生存和死亡的游戏。从理论上来说,网格应该是无边界的,但计算机模拟时可用内存是有限的,因此我们将限定网格“范围”的大小。每个网格元胞要么住着一个活着的生物体,要么空着。住有生物体的元胞是活的,而空元胞是死的。这款模拟游戏通过连续的时间段或连续的几代来描述生物体的生死过程。

元胞的状态可以根据以下规则一代一代地变化:

一个元胞有八个邻居,分别从水平、垂直和对角方向包围此元胞。
如果一个元胞是活的,但它没有活着的邻居或只有一个活着的邻居,那么到了下一代该元胞将会饿死。
如果一个元胞是活的,且有四个或更多活着的邻居,那么到了下一代该元胞将因过度拥挤而死亡。
如果一个元胞是活的,且有二个或三个活着的邻居,那么到了下一代该元胞将继续活下去。
如果一个元胞是死的,且正好有三个活着的邻居,那么到了下一代该元胞将复活。所有其他死元胞到了下一代仍将保持死亡状态。
所有出生和死亡都在同一时刻发生,因此快要死去的元胞可能会促使其相邻元胞出生,但无法通过缓解拥挤程度来阻止其他元胞的死亡,即将出生的元胞也不能杀死或保护上一代活着的元胞。
 

标准模拟算法是检查网格中每一代的所有元胞,计算每个元胞的邻居数量并据此确定该元胞是活还是死,或者根据当代的计算结果来推断它在下一代是否会出生。另一种算法是保存一些元胞列表,其中包含在下一代可能需要注意的元胞。它只重点计算那些可能会导致元胞状态发生改变的元胞。这种备用算法可通过随附的代码实现。这种算法将进行线程化。代码档案文件中还包括一个带有更详细代码描述的文本文件。

代码限制:必须使用主程序中的算法和用于遍历那些列表的四个例程。数据结构(元胞、网格和列表)的实现可根据需要进行修改。

关于输入文件的描述:在应用程序开始执行后,将输入文件的名称以命令行参数的形式赋予应用程序。该文件内将有许多包含成对整数的行,这些成对的整数代表这款模拟游戏开始时活着的元胞所在的行和列。标记 (0 0) 代表活元胞的坐标终端。标记行后跟着下面两行:第一行包含一个整数,它代表要模拟的代的数量;第二行包含两个行-列对(四个整数),它们代表在模拟完成后将打印到标准输出设备的网格区域。(代码档案文件随附一个示范输入数据文件 virus.dat。)

欲下载随附的代码文档,请点击如下链接。
gameoflife.tar
Game of Life.zip

评分标准:“执行情况和所用时间得分”将根据执行速度和输出准确度给出

3、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值