Python编程挑战赛

alt
alt
alt

题1:给小朋友分糖,每人分到糖的数量不同,输入小朋友的数量,计算至少需要多少糖?

思路:第1个小朋友1颗糖,第2个小朋友2颗糖,第3个小朋友3颗糖,……第n个小朋友n颗糖,计算1+2+……+n的和即可。

第1种写法:不用Python高级函数

n = int(input())
r = 0
for i in range(1, n + 1):
    r = r + i
print(r)

第2种写法:用Python高级函数


def splitcandy(n):
    return sum(list(range(1,n+1)))
    
n = 10
print(splitcandy(n))

题2:韩信点兵

一队士兵,3个一数多2人,5个一数多3人,7个一数多2人,问总共有多少人?输入一个数字n,判断在1~n之间有多少满足要求的数字。

第1种写法:不用函数

n = int(input())
for i in range(n):
    if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
        print(i)

第2种写法:函数并数组输出

def hanxin(n):
    ans = []
    for i in range(n):
        if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
            ans.append(i)
    return ans

题3:小明家里有很多不同的趣味书籍,有3个好朋友每人来借一本书(同一本书一次不能借给两个人)

任意输入书籍的数量n(3<=n<=100),输出在所有的书籍中,找3本书给3个人有多少种不同的排列组合方法。

【输入样例】 3 【输出样例】 6

排列组合问题

n = int(input())
print(n * (n - 1) * (n - 2))

题4:情报员使用4位数字来传递信息,同时为了防止信息泄露,需要将数字进行加密。数据加密的规则是:

  1. 每个数字都进行如下处理:该数字加上5之后除以10的余数,替换原数字;
  2. 将处理后第一位数字与第三位数字进行交换,第二位数字与第四位数字进行交换。

现在任意输入一个四位数n(1000<=n<=9999),输出加密之后的数字。

第1种写法:用Python高级函数

def encode(n):
    #step 1st str->int
    nseq = [(int(i)+5)%10 for i in str(n)]
    print(nseq)
    
    #step 2nd
    nseq[0], nseq[2] = nseq[2],nseq[0]
    nseq[1], nseq[3] = nseq[3], nseq[1]
    return ''.join(list(map(str,nseq)))
    
n = 1234
print(encode(n))

第2种写法:不用Python高级函数

n = 1234
r = ""
for a  in str(n):
    r = r + str((int(a) + 5) % 10)

r = r[2]+r[3]+r[0]+r[1]
print(int(r))

题5:我们在寄信的时候都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或者几张的组合,可以满足不同邮件的不同邮资。

已知每个信封上最多能贴5张邮票,至少包含3种面值的邮票。任意输入一个数字n代表邮票的种类,然后依次输入n个数字代表不同种类的邮票面值,计算并输出每个信封上可以构成的邮资的最大值。

【输入样例】n=5

4

1

2

3

4

【输出样例】17

推荐写法:高级函数+集合 重要的原则是不要损失输入参数的完整!

每一封信贴的邮票数量maxs可以灵活设定,不一定是 5 每一封信邮票的面额种类mintype

def stamps(arr,maxs,mintype):#len(arr) = n
    arrs = sorted(set(arr),reverse=True)[:mintype]
    return sum(arrs) + arrs[0]*(maxs-mintype)
arr = [4,1,2,3,4]
maxs,mintype = 5,3
print(stamps(arr,maxs,mintype))

比较下面的写法优劣,下面的写法有几个问题:

1、remove()命令破坏了输入参数的完整 2、上面的写法灵活应对参数应需求的变化:

例如每一封信贴的邮票数量maxs可以灵活设定(不一定是 5) 每一封信邮票的面额种类mintype可以灵活初始化;

n = int(input())
youpiao = []
for i in range(n):
    youpiao.append(int(input()))

max1 = max(youpiao)
youpiao.remove(m1)
max2 = max(youpiao)
youpiao.remove(m2)
max3 = max(youpiao)

print(max1 * 3 + max2 + max3)

不建议上面的写法

题6:一个箱子里面存放着50个球,其中10个红色,10个黄色,30个蓝色。现在从箱子里面任意取n个球,计算并输出不同颜色的球的数量组合一共有多少种可能性。

【输入样例】 2 【输出样例】 6

题6讲解拓展到三原色组合为不同颜色的效果

def combin_rby(r,b,y,n):
    cunt = 0
    for i in range(r):
        for j in range(b):
            for m in range(y):
                if i + j + m == n:
                    cunt += 1
    return cunt
    
  
r, b, y, n, total = 10,10,30,2
print('rby: ',combin_rby(r,b,y,n))

6

三原色的比例不同,颜色不同看参见以前颜色表达链接

题7:依次输入一个字符串s与一个数字n,寻找字符串中所有连续出现n次的字符,统计符合要求的字符数量并输出:例如输入abbcccdddd,输入2,字符串中连续出现2次的字符包括b、c、d这3种

【输入样例】

abbcccdddd

2

【输出样例】3

写法1 函数

def repeat(strng,n):
    cunt = 0
    for c in set(list(strng)):
        if c*n in strng:
            cunt += 1
    return cunt
strng,n = 'abbcccdddd',2
print(repeat(strng,n))

写法2 思路一致

s = input()
n = int(input())
cc = set(s)
r = 0
for c in cc:
    if c * n in s:
        r = r + 1
print(r)

题8:当数字的位数高达上百位时,这样庞大的数字在计算机中的计算已经完全不能用简单的加减乘除来实现了,但是有时候对于这种高精度数字的处理也是编程中必不可缺的。

任意输入一个数字n(99999<n<999999),计算n的n次方(即连续n个n相乘)计算之后,最后的3位数字是多少?

【输入样例】 123456 【输出样例】 856

n = int(input())
n = n ** n
a = n % 10
b = n % 100 // 10
c = n % 1000 // 100
print(str(c * 100 + b * 10 + a))

题9:一群渔民被海盗抓住了,依次坐在编号为1~n的凳子上,其中有一个人身上有藏宝图。现在海盗想要找那个身上带着宝藏的渔民,海盗先将1号凳子上面的人搜身,没找到就隔1个凳子,将3号凳子上面的人搜身,没找到就隔2个凳子,将6号凳子上面的人搜身。以后每次多隔一个凳子去搜索……这样下去找了100次没找到,最终放弃了把渔民释放了。任意输入一个数字n(5<=n<=20)代表渔民的数量,依次输出哪些编号的渔民不会被搜身。

【输入样例】 10

【输出样例】 [2, 4, 7, 9]

写法1

def notFind(n):
    seat = [1] * n
    idx = 0
    for d in range(2,103): #100 steps
        seat[idx] = 0
        idx = (idx+d) % n
    return [i+1 for i,e in enumerate(seat) if e==1]

n = 10
print(notFind(n))

写法2

n = int(input())
lst = [0] * n
jiange = 1
suoyin = 0
c = 0
while 1:
    lst[suoyin % n] = 1
    jiange = jiange + 1
    suoyin = suoyin + jiange
    c = c + 1
    if c == 100:
        break
for i in range(n):
    if lst[i] == 0:
        print(i + 1)

题10:学校举办亲子运动会,所有的父亲一组,孩子一组,出场规则是:父亲组先派一个人上场之后孩子组才能派一个人上场,假设每队3对父子,可能的出场策略包括5种:父父父子子子、父父子子父子、父父子父子子、父子父父子子、父子父子父子。

任意输入父子的对数n(3<=n<=15),计算并输出有多少种出场策略。

【输入样例】 3 【输出样例】 5

思路

第一个必须安排父亲,那么还有n-1个父亲分布 2,3, ... ... 2×n,

排列组合 C(n-1,2n-1)= (2n-1)×(2n-2)× ....2n / (n-1)×(n-2)×... ...1

alt

第1种写法 不用高级函数,解析排列组合公式

def solve(n):
    out = 1
    for i in range(1,n):
        out *= (2*n-i)/(n-i)
    return out
    
print(solve(n=3))
10.0

第2种写法 用高级函数

导入itertoolspermutations 条件判断过滤,保留符合每一个组合中第一个元素是 f

from itertools import permutations
def permut(n):
    f, s = n* ['f'], n * ['s']
    res = list(permutations(f+s,2*n))
    resfilter = [p for p in res if p[0]=='f']
    return len(set(resfilter)),set(resfilter)
    
n = 3
print(permut(n))

10

#所有组合

 {('f''s''f''s''s''f'), 
 ('f''s''f''s''f''s'), 
 ('f''f''f''s''s''s'), 
 ('f''f''s''f''s''s'), 
 ('f''f''s''s''f''s'),
 ('f''s''s''f''f''s'), 
 ('f''s''s''s''f''f'), 
 ('f''f''s''s''s''f'), 
 ('f''s''s''f''s''f'), 
 ('f''s''f''f''s''s')})

两种写法结果一致!

本文由 mdnice 多平台发布

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息素养Python编程挑战赛复赛通常是一个集理论知识和实践技能于一体的比赛,旨在考察参赛者的Python编程能力、解决问题的能力以及对信息资源有效利用的理解。这类比赛通常包括以下几个环节: 1. **主题与任务**:复赛可能会围绕数据处理、算法设计、网络爬虫、人工智能应用等现代技术热点,参赛者需要完成相关编程任务,如数据分析、Web接口自动化或机器学习模型实现。 2. **知识要求**:参赛者需要具备扎实的Python基础知识,如语法、数据结构、函数、模块和库的使用,同时对面向对象编程有一定了解。 3. **时间限制**:复赛往往设置有限的时间框架,参赛者要在规定时间内提交代码并解决可能出现的问题。 4. **团队协作**:有些比赛可能支持团队合作,团队成员需要协作完成任务,提高沟通和协作技巧。 5. **评测标准**:评判不仅看代码的功能性,还可能评估代码的可读性、优化程度、文档说明以及问题解决策略。 如果你参加此类比赛,建议提前准备: - **熟悉Python编程语言**:确保对基础语法和常用库如Numpy、Pandas、Matplotlib等有深入理解。 - **练习算法和数据结构**:这有助于在比赛中快速找到解决方案。 - **实战项目经验**:尝试完成类似的小项目,提升实际操作能力。 - **查阅文档和社区资源**:遇到问题时,学会利用官方文档和在线社区寻找答案。 相关问题-- 1. 信息素养Python编程挑战赛复赛的具体时间安排是什么? 2. 复赛中常见的评分标准有哪些? 3. 如何准备团队合作部分的挑战?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值