ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ACM_ICPC_Team

2019-10-24 13:00:51  阅读:347  来源: 互联网

标签:count int max topics ACM ICPC topic num Team


题目:

There are a number of people who will be attending ACM-ICPC World Finals. Each of them may be well versed in a number of topics. Given a list of topics known by each attendee, you must determine the maximum number of topics a 2-person team can know. Also find out how many ways a team can be formed to know that many topics. Lists will be in the form of bit strings, where each string represents an attendee and each position in that string represents a field of knowledge, 1 if its a known field or 0 if not.
附上链接:ACM_ICPC_Team

初步想法

这题我初见想到的就是简单的三次循环遍历

for i in range(n):
    for j in range(i + 1, n):
        for k in range(m):
            # 进行判断及计数等操作

虽然功能上一定可以实现,但是时间复杂度达到了O(n^2 * m)的地步,这显然不能满足要求

进阶解决

为了避免嵌套循环大量消耗时间,我改用itertools库中的combinations(list, num)函数,该函数可以根据给定的参数完成对给定列表的全组合,即数学上的C(num, len(list)),结果返回一个包含全部全组合的元组,于是最外层的两个循环备修改为如下代码:
for i in itertools.combinations(topic, 2):
即将列表topic中的每两个元素分别组合形成一个新元组,并对其进行遍历,就实现了之前的那两个外层循环同样的功能

而后对第三个循环的思考中我发现:
题目中已经给定的主函数中,传入的变量是一个元素为字符串形式的列表,而不是数值形式
这就又为我们解题提供了方便,将两者进行或操作并判断1的个数就简化为了下面这一句话:
count = str(bin(int(i[0], 2) | int(i[1], 2))).count('1')
其中int(***, 2)中的第二个参数2表示将字符串转换为二进制数字

最终程序

简化了上面的问题,这个题目也就没有难点了,下面附上我最终通过的代码

def acmTeam(topic):
    combine = itertools.combinations(topic, 2)
    max_num = 0
    num = 1
    for i in combine:
        res = str(bin(int(i[0], 2) | int(i[1], 2)))
        count = res.count('1')
        if count > max_num:
            max_num = count
            num = 1
        elif count == max_num:
            num += 1
    return max_num, num

标签:count,int,max,topics,ACM,ICPC,topic,num,Team
来源: https://www.cnblogs.com/ilk123/p/11731227.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有