百度空间 | 百度首页 
 
查看文章
 
2006年百度之星程序设计大赛复赛题目1
2007-05-14 18:06

另类杀人游戏

周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从11匪到nn匪,他们尝试了几乎所有流行的杀人游戏规则。终于有一天,连最热衷杀人游戏,“杀人”不眨眼的Austin也开始对无休止的辩论感到厌烦。于是,他决定改变他的一贯作风,他开始变成了一个“杀人不睁眼”的杀手。

如何做到杀人不睁眼呢?Austin早已构思好他的杀人计划:

1.  N个人(包括Austin)坐成一圈玩杀人游戏,按顺时针编号1234。。。。。

2.  Austin1号开始顺时针开始数到第m号就杀掉第一个人。被杀掉的人要退出游戏。

3.  如果第m个人恰好是Austin自己,他就杀掉他顺时针方向的下一个人。

4.  Austin从被杀的人的下一个顺时针数m个人,把第m个杀掉。

5.  重复2-4,直至杀掉所有人。

Austin把这个杀人计谋告诉了法官小k,他便可以闭起眼睛杀人啦。作为一个正直善良的法官,小k当然不能让残忍的Austin得逞,于是,她偷偷把Austin的杀人计划告诉了作为警察的你,聪明的百度之星。现在,你的任务是活到最后,与Austin单挑。

输入:

第一个行包含一个整数T,表示有T组测试数据。

对于每组测试数据:

三个整数

NMT(3<=N<=10000,1<=M,T<=10000) 分别表示参与游戏的人数,Austin每隔M个人会杀掉一人,Austin初始位置的标号。

输出:

每个测数数据输出一个整数。

你需要选择的初始位置的序号,以确保最后剩下的两个人是你与Austin

输入例子:

2

7 4 1

7 4 1

输出例子

5

5

例子说明:杀人顺序为4 2 7 6 3 5 所以5 是你要选择的位置。


类别:百度之星历年题目 | 添加到搜藏 | 浏览() | 评论 (11)
 
最近读者:
 
网友评论:
1
2007-05-17 18:22 | 回复
杀人,你们百度公司也太……太……
 
2
2007-05-18 10:27 | 回复
针对这个游戏,我用VB写了一段代码,完全符合要求. Private Sub cmdPlay_Click() Dim lngMembers As Long Dim lngStep As Long Dim lngPosKiller As Long lngMembers = Left(Trim(txtInput.Text), 1) lngStep = Mid(Trim(txtInput.Text), 3, 1) lngPosKiller = Right(Trim(txtInput.Text), 1) If lngMembers < 3 Or lngMembers > 10000 Then MsgBox "游戏总成员数不合法,请保证乘员数在[3-10000]之间!", vbInformation, "Identity" Exit Sub End If If lngStep < 1 Or lngStep > lngMembers Then MsgBox "杀人的间隔不合法,请保证杀人的间隔大于0且不大于总乘员数!", vbInformation, "Identity" Exit Sub End If If lngPosKiller > lngMembers Or lngPosKiller < 1 Then MsgBox "杀手初始位置不合法,请保证杀人的初始位置大于0且不大于总乘员数!", vbInformation, "Identity" Exit Sub End If Call DoPlay(lngMembers, lngStep, lngPosKiller) End Sub
 
3
2007-05-18 10:30 | 回复
接着上面的代码: Private Function DoPlay(ByVal lngMembers As Long, ByVal lngStep As Long, ByVal lngPosKiller As Long) Dim lngFromFlag As Long '开始数的位置 Dim lngPosDead As Long '被杀掉的人的位置 Dim colMembers() As Long '装载玩游戏人的数组 Dim colBridge() As Long '过程中用于过渡的数组,每杀掉一个,就把colMembers数组中剩余的人装载到该数组中 Dim lngI As Long Dim lngJ As Long Dim lngK As Long ReDim colMembers(lngMembers - 1) lngJ = 1 For lngI = 1 To lngMembers colMembers(lngI - 1) = lngI '把玩游戏的成员全部栽入数组colMembers中 Next lngFromFlag = 0 '第一次从数组中的0号位开始顺时针数,也就是编号1的人 ReDim colBridge(lngMembers - 1) Do While UBound(colBridge) > 1 lngPosDead = lngFromFlag + lngStep - 1 If lngPosDead >= lngMembers Then '如果被杀的人的位置超过了总成员数
 
4
2007-05-18 10:31 | 回复
'接着上面的代码: If lngPosDead = lngPosKiller - 1 Then '在数组中,如果被杀的人刚好是杀手,那么杀手的下面一个人将要被杀掉 lngPosDead = lngPosKiller - 1 + 1 End If lngFromFlag = lngPosDead + 1 '记录下一次开始数的位置,也就是被杀掉的人的下一位开始数 For lngK = lngFromFlag To UBound(colMembers) '被杀掉的人退出游戏,也就是在数组中去掉该值 colMembers(lngK - 1) = colMembers(lngK) Next If lngFromFlag >= lngMembers Then '如果下一次的起始位置超过了总成员数,就用该数减去成员数,也就是形成圆的概念 lngFromFlag = lngFromFlag - lngMembers + 1 End If ReDim colBridge(UBound(colMembers) - lngJ) lngI = 0 Do While lngI <= UBound(colBridge) '把colMembers数组中剩余的人装载到colBridge数组中 colBridge(lngI) = colMembers(lngI)
 
5
2007-05-18 10:32 | 回复
'接着上面的代码: lngMembers = lngMembers - 1 '一人被杀掉,总成员数减1 lngFromFlag = lngFromFlag - 1 '在新数组中,下一次的起始位置要减去1,因为整体数组中已经有一人退出了游戏 lngJ = lngJ + 1 '定义colBridge数组边界将要缩小的范围 Loop If colBridge(1) <> lngPosKiller Then MsgBox "" & colBridge(1) & "", vbInformation, "Identity" Else MsgBox "" & colBridge(0) & "", vbInformation, "Identity" End If End Function
 
6
2007-05-18 18:28 | 回复
第一题肯定是送分的,这样的题在我们学数据结构时就做过了,呵呵
 
7
2007-05-22 14:21 | 回复
这题需要nlog(n)或者更低复杂度的算法才能过
 
8
2007-05-24 10:29 | 回复
呵呵~ BAIDU也不干好事啊~ 这题说的明确了~所以比较简单~
 
9
2007-05-24 17:01 | 回复
你也不看看数据范围.... 10000 必须nlogn以下算法 6楼sb
 
10
2008-08-03 11:33 | 回复
关注百度之星~~~~~~~~!
 
11
2008-08-04 13:11 | 回复
简单
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu