`
t225com
  • 浏览: 660433 次
文章分类
社区版块
存档分类
最新评论

谎言与诚实谜题

 
阅读更多

诚实村与谎言村

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

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

输入规范

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

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

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

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

输出规范

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

输出示例如下:
  • 3 2
====================个人解决方案===========================

这个算法不完善,时间有限,并且STL库在有些系统上在递归时产生段错误。如果将队列改为不能重复的在大数据量时会更好。大家帮忙看看有没有更好的方案。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics