题目是:10名选手参加象棋比赛,每2名选手之间都要比赛一盘。记分方法是胜一盘得2分,平一盘得1分,负一盘得0分。比赛结果出来时选手们所得分数各不相同。已知第一名和第二名一盘都没有输过,前两名的得分总和比第三名多20分,第四名与最后四名得分总和相等。则第三名得多少分?
这个题不太容易列式或列方程求解,如果推理的话,容易推出前4名的成绩。但是,为了验证一下推理的结果,就用编程穷举一下吧:
#用x1-x10表示第一名至第10名的得分
#因为成绩各不相等,很容易得出各选手分数上下限
#将已知或推导出的条件用上:总分90,第一+第二=第三+20,
第四=后四名之和,第一至第十成绩为降序。
for x1 in range(9,18):
for x2 in range(8,17):
for x3 in range(7,16):
for x4 in range(6,15):
for x5 in range(5,14):
for x6 in range(4,13):
for x7 in range(3,12):
for x8 in range(2,11):
for x9 in range(1,10):
for x10 in range(0,9):
if x1+x2+x3+x4+x5+x6+x7+x8+x9+x10==90
and x1+x2-x3==20 and x4==x7+x8+x9+x10
and x1>x2 and x2>x3 and x3>x4 and x4>x5
and x5>x6 and x6>x7 and x7>x8 and x8>x9 and x9>x10:
print(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)
解出来了,但用时太长,大约10分钟。这种循环多的代码,适合用多线程,只需简单的修改一下代码即可,将这个循环改为函数,然后开进程算。这里将第一名的可能的成绩分给各进程计算:
def abc(x1) : for x2 in range(8,17): for x3 in range(7,16): for x4 in range(6,15): for x5 in range(5,14): for x6 in range(4,13): for x7 in range(3,12): for x8 in range(2,11): for x9 in range(1,10): for x10 in range(0,9): if x1+x2+x3+x4+x5+x6+x7+x8+x9+x10==90 and x1+x2-x3==20 and x4==x7+x8+x9+x10 and x1>x2 and x2>x3 and x3>x4 and x4>x5 and x5>x6 and x6>x7 and x7>x8 and x8>x9 and x9>x10: print(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)thread1=threading.Thread(target=abc(9))thread2=threading.Thread(target=abc(10))thread3=threading.Thread(target=abc(11))thread4=threading.Thread(target=abc(12))thread5=threading.Thread(target=abc(13))thread6=threading.Thread(target=abc(14))thread7=threading.Thread(target=abc(15))thread8=threading.Thread(target=abc(16))thread9=threading.Thread(target=abc(17))thread1.start()thread2.start()thread3.start()thread4.start()thread5.start()thread6.start()thread7.start()thread8.start()thread9.start()
这个也解出了相同的答案,用时5分钟,节省了一半时间,受制于硬件水平以及代码还有优化的空间,节省的时间不是很多。
对了,题目的答案为:

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/75028
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!