算法笔试题:诚实村与谎言村

xufei96 2011-10-13 01:43:38
一天,你跟随渔夫出海打鱼,在海上遇到了大风浪而迷失了方向,小船被刮到了一座小岛上。岛上有两个相邻的村子,一个叫诚实村,一个叫谎言村,诚实村的村民只会说真话,从不撒谎,而谎言村的村民则只说谎话,从不说真话。所以你决定想办法区分出这不同的两组人,弄清楚谁说的是真话,这样才能够找到回去的方向。这两个村的村民很热情,有问必答,你要求每位村民给你一份他们认为是说谎者的名单。这些村民世世代代都生活在这里,所以他们非常清楚谁在说谎。但是为了不得罪人,每位村民勉强地只给了你一份不全的名单,当然这些名单也不能尽信。

你必须编写一个程序来筛选你所收集到的这些信息,并判断哪些村民是在说真话,哪些村民是在说谎话。两个村的村民人数很多,所以你的程序必须能快速并有效的处理大量数据。

输入规范你的程序必须获取一个唯一的命令行参数,即文件的名称。打开文件并且解析里面的数据。这些数据以村民的数量 n 开头,行尾另起一新行。后面跟着是连续的 n 块信息,每块信息描述的是一个村民所举报的那些说谎者名单。每一块的格式如下:

<accuser name> <m>(其中:accuser name 表示举报人名字,m 表示被举报说谎的人数。)

而后紧跟 m 行,每一行包含一个被举报的人员名字。accuser name 和 m 被一些制表符(tab)和空格隔开。m 总是在 [0, n] 区间。所有人员的名字只包含字母且是唯一的并区分大小写。

输入文件示例:
5
Stephen 1
Tommaso
Tommaso 1
Galileo
Isaac 1
Tommaso
Galileo 1
Tommaso
George 2
Isaac
Stephen

输出规范你的程序输出必须由两个数字组成,数字之间由一个空格隔开,结尾另起一新行(换行符为 "\n"),打印至标准输出。第一个数字是说谎者和诚实者中人数较多的一组人数; 第二个数字是人数较少的一组人数。我们保证这些测试数据只有一个正确的解决方法。

输出示例如下: 3 2

这是一家公司贴在网上的笔试题,我觉得有问题,如果按我下面的测试数据根本推不出说谎者小组或者诚实者小组的人数。
test.txt:
6
A 2
B
C
B 1
A
C 1
A
D 2
E
F
E 1
D
F 1
D

因为ABC与DEF根本属于两个毫无关联的关系网,只能确定A与BC不在一组,也能确定D与EF不在一组,但是A与DEF的关系却确定不了。因此人数也不能确定 因为不知道A 跟另一个关系网里面的D是一组 还是EF是一组。
我跟他们公司的技术人员联系沟通后,他们解释是已经说明了”我们保证这些测试数据只有一个正确的解决方法。“, 不过我还是觉得这个题目本身是错误的。。。。
...全文
538 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Guo 2013-05-20
  • 打赏
  • 举报
回复
文明盛世吧,我也遇到这个题。
g4_magicvr 2011-10-13
  • 打赏
  • 举报
回复
你那个例子应该不是他给你的
如果是他给你的话的话 你可以直接叫他去死

因为这个本事是信息限制题目 如果题目本身无解 直接输出 Error
xufei96 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 g4_magicvr 的回复:]
这个试题其实是个文字游戏 你根本不需要知道他们是否说谎
你只需要得出每个组的人数就OK了……
[/Quote]问题是我们得不出每个组的人数 他给的那个例子可以 但是我下面的那个ABCDEF的例子就不行,得不出人数来 不信你算算
xufei96 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vip__888 的回复:]
引用 3 楼 xufei96 的回复:
引用 2 楼 fire_fire_fire 的回复:

他们的工资有几十K一个月?如果没有就不要费这个脑筋想了。呵呵
别这么说,人家给的还是蛮高的:
谜题提交后,考官机器人30分钟内出结果。成功完成难度为高的谜题,马上获得年薪20万到50万的高级软件工程师职位的面试资格!

还只是资格啊?
[/Quote] 这个是比我写这道题更难的一道 做出来有资格
vip__888 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xufei96 的回复:]
引用 2 楼 fire_fire_fire 的回复:

他们的工资有几十K一个月?如果没有就不要费这个脑筋想了。呵呵
别这么说,人家给的还是蛮高的:
谜题提交后,考官机器人30分钟内出结果。成功完成难度为高的谜题,马上获得年薪20万到50万的高级软件工程师职位的面试资格!
[/Quote]、
还只是资格啊?
g4_magicvr 2011-10-13
  • 打赏
  • 举报
回复
这个试题其实是个文字游戏 你根本不需要知道他们是否说谎
你只需要得出每个组的人数就OK了……
g4_magicvr 2011-10-13
  • 打赏
  • 举报
回复
- -这个 我的方法非常简单粗暴

两个hashset
比如是是A and B

1.把第一步的举报人放在A 被举报人放在B
2.然后往下读 一个循环 检查举报人的姓名是否在A表中 如果是 则把被举报人全部放在B表
3.然后再循环 检查举报人名单时都在B表中 如果是 怎么被举报人全部放进A表
4.重复2和3,知道数据全部进入两个表
5.比较A和B的元素个数 个数大的在前 小的在后 输出
xuan.ye 2011-10-13
  • 打赏
  • 举报
回复
题目,都没看懂,如果是英文题目,更看不懂
xufei96 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fire_fire_fire 的回复:]

他们的工资有几十K一个月?如果没有就不要费这个脑筋想了。呵呵
[/Quote] 别这么说,人家给的还是蛮高的:
谜题提交后,考官机器人30分钟内出结果。成功完成难度为高的谜题,马上获得年薪20万到50万的高级软件工程师职位的面试资格!
fire_fire_fire 2011-10-13
  • 打赏
  • 举报
回复
他们的工资有几十K一个月?如果没有就不要费这个脑筋想了。呵呵
xufei96 2011-10-13
  • 打赏
  • 举报
回复
原题要求:
所有提交的程序必须能够在 Linux x86 系统环境中运行(请注意我们不接受在Windows环境中运行的解决方法)。参与者不能使用超出程序语言或编译器本身的函数库和插件。参与者可以使用的编程语言如下:
GNU C/C++ 4.2.3
Perl 5.8.8
PHP 5.1.6
Python 2.4.3

7,774

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧