python编程之列表习题(3个)

2025-12-12 20:40:04

1、题目1:猴子选大王

【问题描述】要从n只猴子中选出一位大王。它们决定使用下面的方法:


n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。
【输入形式】控制台输入三个整数n,m,q。
【输出形式】输出最后选为大王的猴子编号

2、明确思路:把第q只猴子当成第一只猴子进行,把每只猴子对应列表中的位置令为1,进行操作,淘汰的猴子令为0,最后再进行判断即可。注意,最后得出的猴子序号要加上q-1返回原本对应的猴子编号 ,另外返回得出的编号大于猴子总数,这时对猴子总数求余即可。    

难度系数:三颗星                            

3、代码如下:

N,m,q= input().split()

N=int(N)

m=int(m)

q=int(q)

stand = []

for i in range(N):

        stand.append(1)

c=0

n = N

while n>=2:

    for i in range(0,N):

        if stand[i]==1:                        

            c = c+1

            if c==m:

                stand[i] = 0

                c = 0

                n = n-1

num=stand.index(1)+q

print(num%N)  

4、【样例输入】


7  4  3
【样例输出】
4

5、题目2:造句练习

【问题描述】假设有三个列表: Ist who=小马,"小羊,"小鹿], Ist where草地上,电影院,家里], Ist what=看电影,听故事’吃晚饭]。写出所有造句结果

6、明确思路:使用循环嵌套,遍历每种情况,将每种组合进行输出

难度系数:一颗星

7、代码如下:

import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

sys.stdin = io.TextIOWrapper(sys.stdin.buffer,encoding='utf-8')

who=["小马","小羊","小鹿"]

where=["草地上","电影院","家里"]

what=["看电影","听故事","吃晚饭"]

ls=[]

for i in range(3):

    for j in range(3):

        for t in range(3):

            ls.append(str(who[i])+"在"+str(where[j])+str(what[t]))

for i in ls:

    print(i)

8、【样例输出】

小马在草地上看电影

小马在草地上听故事

小马在草地上吃晚饭

小马在电影院看电影

小马在电影院听故事

小马在电影院吃晚饭

小马在家里看电影

小马在家里听故事

小马在家里吃晚饭

小羊....

9、题目三:求二维整型数组“鞍点”

【问题描述】

求二维整型数组的鞍点。二维数组的;鞍点定义为:某个数是所在行的最大值,并且是所在列的最小值。

【输入形式】

从控制台读入二维数组。

第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。

然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。

【输出形式】

向控制台输出二维数组的鞍点,按行下标、列下标从小到大的顺序输出,每行一个,先输出鞍点数值,再输出对应的行下标、列下标(下标从1开始),以空格分隔。若没有鞍点,则输Noanswer。

10、明确思路:先解决二维数组的输入,再进行计算,具体思路标注在如下代码中。

难度系数:五颗星

11、m,n=input().split()

m=int(m)

n=int(n)

ls=[]

lt=[]

dp=[]

#输入并转换为数值列表

for i in range(m):

    a=list(input().split())

    for j in range(n):

        a[j]=int(a[j])

    ls.append(a)

#选每行最大值

for i in range(m):

    b=max(ls[i])

    #判断有无重复最大值

    if ls[i].count(b)==1:

        c=ls[i].index(b)

        #选列最小值

        for k in range(m):

            lt.append(ls[k][c])

            d=min(lt)

        #判断该点是否为鞍点

        if b==d:

            dp.append([b,i+1,c+1])

        lt.clear()

    #再判断重复为二,步骤同上

    elif ls[i].count(b)==2:

        c=ls[i].index(b)

        for k in range(m):

            lt.append(ls[k][c])

            d=min(lt)

        if b==d:

            dp.append([b,i+1,c+1])

        lt.clear()

        ls[i][c]=0

        o=max(ls[i])

        p=ls[i].index(o)

        for k in range(m):

            lt.append(ls[k][p])

            d=min(lt)

        if b==d:

            dp.append([b,i+1,p+1])

        lt.clear()

#判断有无鞍点

if len(dp)==0:

    print('No answer')

else:

    #将数值列表转换成字符串列表,再将列表转换成字符串输出

    for i in dp:

        i=[str(g) for g in i]

        j=' '.join(i)

        print(j)

12、【样例输入】

3 4

8   60   7  100

10  49  12  49

-71 132  4   85

【样例输出】

49 2 2

49 2 4

13、经验总结:对于刚学习这一部分的人来说,第三题会比较困难,一些基础操作不会,对于我自己,有些操作没有学过,就自己上网查,但是一般问题没办法直接得到解决,甚至有些信息是不太准确的,我都是查一点资料联系自己的方式理解一点,然后慢慢思考,有的时候一道题比较难的时候会花两三天时间才能解决。不过,当每次思考出来的时候会觉得收获很多,长期累积,做题的经验也会很多,碰到难题心里也不会慌了。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢