本帖最后由 Jc嘻嘻 于 2017-5-21 15:47 编辑
1. 5个候选人(放在一个txt文件) 2. 对应的选票(放在另一个txt 文件 ; 每行格式 1,2,3,4,5 3. 每一个选民可以按优先顺序投票, 1-5个等级(1为最喜欢---) 例子: 3. 规矩:上面的四票例子 表示 有4个人投票,他们的选票分别为…. 1,2,4,3,5 2,1,4,3,5 5,4,1,2,3....对应每个候选人的喜爱程度
第一步,先统计出每个人得票为1票数的总数,如果没有人超过总票数的50%,那么得第一的票数最少的那个候选人被排除,并将这个候选人的第2票数分别归给对应的候选人,如果他是第2票,那个分给第三票,以此类推,除非他的票数对应的候选人都被提出,则此票。 (逻辑: 比如第一轮下来,按上面的例子,候选人E没有为1的票数最少,那么他的票数分别为4,5,3,2 则分别分给得票为(4+1,5+1,3+1,2+1)的候选人, 即分给(5,6,4,3), 因为没有6,所以这票作废,第一票(5)理应分给候选人C,但如果候选人C之前被排除了,这票也作废)
下面是两个数据(不知道怎么上传文件,麻烦自创一下测试) 候选人文件: Major Clanger Soup Dragon Froglet Iron Chicken The Cloud
选票文件:
1,3,4,5,2 4,2,5,3,1 1,3,2,5,4 1,2,4,3,5 1,3,4,5,2 2,1,3,5,4 1,4,5,2,3 5,1,4,3,2 3,2,5,4,1 3,1,2,5,4 2,5,1,4,3 3,2,1,4,5 4,5,3,1,2 1,5,4,3,2 1,5,3,4,2 2,1,4,3,5 4,1,2,5,3
下面是我现在尝试写的,后面写到字典真不知道如何分别将为1的取出汇总再比较再排除
#def main(candidates_file_name, ballots_file_name,optional=False) def getCandidates(canfidates_file_name): try: with open(canfidates_file_name, 'r') as file: return [each.strip("\n") for each in file.readlines()] except: return []
def mf(f): l = [] b = f.strip('\n').split(',') for i in range(0,len(b)): if b =='': b='0' l.append(b) else: l.append(b) return l
def getPapers(f): try: l = [] x = open(f, 'r') flines = x.readlines() for i in range(0, len(flines)): l.append(mf((flines))) return l except: return []
def main(): l = [] a = getCandidates('candidates.txt') b = getPapers('papers2.txt') for i in range(len(a)-1): #candidates for ii in range(len(b)): # l.append({a:b[ii]})
return l
本帖最后由 yongxi 于 2017-5-21 23:56 编辑
第一:
既然1--5 1为最喜欢 那么数字代表的根本就不是票数 ,而是喜欢程度。并且数字越大越不喜欢
按照楼主的分票对应逻辑。 如果第一轮 有人拿了很多1 ,但是没超过50. 是不是淘汰的人把票分给他
无缘无故多了茫茫多的 4 和 5 。那么就是茫茫多的不喜欢来了。 这是什么选举逻辑?
第二:
并将这个候选人的第2票数分别归给对应的候选人 对应关系是什么? 就是你所说的4+1 5+1?
那么问题来了。 4+1 代表的意思就是 把非常讨厌变成了极度讨厌。 。第一位选民已经给c投票极度讨厌,就因为E被淘汰,c就又多出一张极度讨厌了?
我的看法:
编程目的是解决实际问题。楼主这个题目的逻辑就有问题
如果你强行要弄出来 建议简化。 它哪里是一个投票! 投票是民主的, 你这个就是运气,看的是每个选民的数字排列了。本质就是一个数字归类的问题
第一次统计之后
把根据候选人名字生成相对性名字的列表
票面数字按照字符串索引值 归类给abcde5个列表
以下内容写成递归:
count abcde中1的次数 ,次数最少的列表 把每个元素的值+1 用if 判断是否大于5
然后按照你所说的对应关系 把e的内容逐渐添加到其他列表、为了方便写代码。在最开始
的时候把abcde5个列表丢进一个大列表,这样可以用索引值的形式每次递归后删除相对应的列表
知道剩下最后一个列表。 可以结束递归了。
但是我思来想去, 有何意义啊? 所以我也懒得动手写了。
|