诚实村与谎言村

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

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

输入规范你的程序必须获取一个唯一的命令行参数,即文件的名称。打开文件并且解析里面的数据。这些数据以村民的数量 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

所有提交的程序必须能够在 Linux x86 系统环境中运行(请注意我们不接受在Windows环境中运行的解决方法)。参与者不能使用超出程序语言或编译器本身的函数库和插件。参与者可以使用的编程语言如下:
GNU C/C++ 4.2.3
Perl 5.8.8
PHP 5.1.6
Python 2.4.3


rt, Python Codes as below:

import os, string persons = {} person_marks = {} class Person(object): Name = '' PersonList = [] def del_person_key(personkey, value = False): for personItem in persons[personkey].PersonList: if not person_marks.has_key(personItem.Name): person_marks[personItem.Name] = value del persons[personkey] def reverse(num1, num2): return num2, num1 file_path = raw_input("Please input the file path:") file_stream = open(file_path, 'r') currentPerson = None while True: line_str = file_stream.readline() items = line_str.split() if len(items) <= 0: break if items[0].isdigit(): continue currentPerson = Person() currentPerson.Name = items[0] currentPerson.PersonList = [] items_count = int(items[1]) for i in range(items_count): line_str = file_stream.readline() items = line_str.split() personItem = Person() personItem.Name = items[0] currentPerson.PersonList.append(personItem) persons[currentPerson.Name] = currentPerson while len(persons.keys()) > 0: if len(person_marks.keys()) == 0: personkey = persons.keys()[0] person_marks[personkey] = True del_person_key(personkey, False) else: for personkey in persons.keys(): if not person_marks.has_key(personkey): pass elif person_marks[personkey] == True: del_person_key(personkey, False) else: del_person_key(personkey, True) num1 = 0 num2 = 0 for mark_key in person_marks.keys(): if person_marks[mark_key] == True: num1 += 1 else: num2 += 1 if num1 < num2: num1, num2 = reverse(num1, num2) print num1, num2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值