你必须编写一个程序来筛选你所收集到的这些信息,并判断哪些村民是在说真话,哪些村民是在说谎话。两个村的村民人数很多,所以你的程序必须能快速并有效的处理大量数据。
输入规范你的程序必须获取一个唯一的命令行参数,即文件的名称。打开文件并且解析里面的数据。这些数据以村民的数量 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