鱼C论坛

 找回密码
 立即注册
查看: 2460|回复: 3

[已解决]求解一个计算票数的程序!

[复制链接]
发表于 2017-5-21 15:43:09 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 Jc嘻嘻 于 2017-5-21 15:47 编辑

1.     5个候选人(放在一个txt文件)
2.     对应的选票(放在另一个txt 文件 ; 每行格式  1,2,3,4,5
3.   每一个选民可以按优先顺序投票, 1-5个等级(1为最喜欢---)
例子:
  
A
  
B
C
D
E
1
2
5
3
4
2
1
4
3
5
5
4
1
2
3
5
4
3
1
2
以此




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+15+13+12+1)的候选人, 即分给(5643), 因为没有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






最佳答案
2017-5-21 15:43:10
本帖最后由 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个列表丢进一个大列表,这样可以用索引值的形式每次递归后删除相对应的列表

知道剩下最后一个列表。 可以结束递归了。

但是我思来想去, 有何意义啊? 所以我也懒得动手写了。

papers.zip

186 Bytes, 下载次数: 3

选票

candidates.zip

62 Bytes, 下载次数: 2

候选人

最佳答案

查看完整内容

第一: 既然1--5 1为最喜欢 那么数字代表的根本就不是票数 ,而是喜欢程度。并且数字越大越不喜欢 按照楼主的分票对应逻辑。 如果第一轮 有人拿了很多1 ,但是没超过50. 是不是淘汰的人把票分给他 无缘无故多了茫茫多的 4 和 5 。那么就是茫茫多的不喜欢来了。 这是什么选举逻辑? 第二: 并将这个候选人的第2票数分别归给对应的候选人 对应关系是什么? 就是你所说的4+1 5+1? 那么问题来了。 4+1 代表的意思就是 把非 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 15:43:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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个列表丢进一个大列表,这样可以用索引值的形式每次递归后删除相对应的列表

知道剩下最后一个列表。 可以结束递归了。

但是我思来想去, 有何意义啊? 所以我也懒得动手写了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-21 15:55:04 | 显示全部楼层
本帖最后由 Jc嘻嘻 于 2017-5-21 17:29 编辑

我目前的code
#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)-1):
            l.append(mf((flines)))
        return l
    except:
        return []

def countNum(b,a,n):
    l = []
    count = 0
    for i in range(len(a)):
        for ii in range(len(b)):
            if int(b[ii]) == n:
                count = count + 1
        l.append(count)
        count = 0
    return l
# 50%
def judge(f):
    sum = 0
    for i in range(len(f)-1):
        sum = sum + int(f)
    for i in range(len(f)-1):
        if int(f)/sum > 0.5:
            break;
    print('> 50%, ending')
        
           
def main():
    a = getCandidates('candidates.txt')
    b = getPapers('papers2.txt')
    ll =[]
    for i in range(len(a)):
        ll.append([countNum(b,a,i+1)])
    return ll

>>> main()
[[[8, 4, 2, 1, 3]], [[3, 4, 3, 1, 7]], [[4, 4, 3, 5, 2]], [[2, 1, 7, 5, 3]], [[1, 5, 3, 6, 3]]]
分别是第一 第二 第三 第四 第五的对应票数
我要得到的效果是
Count 1
8        Major Clanger
5        Soup Dragon
3        The Cloud
2        Froglet
1        Iron Chicken

Candidate Iron Chicken has the smallest number of votes and is eliminated from the count

Count 2
8        Major Clanger
5        Soup Dragon
4        The Cloud
2        Froglet

Candidate Froglet has the smallest number of votes and is eliminated from the count

Count 3
9        Major Clanger
6        Soup Dragon
4        The Cloud

Candidate The Cloud has the smallest number of votes and is eliminated from the count

Count 4
11        Major Clanger
8        Soup Dragon


Candidate Major Clanger is elected
   
   
               
               
                  
   
              
   



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 18:28:04 | 显示全部楼层
题目描述的看都看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 17:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表