蓝桥杯每日练习3

一、数列特征

1、题目

给出n个数,找出这n个数的最大值,最小值,和。

输入
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。

输出
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。

2、样例

输入

5
1 3 -2 4 5

输出

5
-2
11

3、解析

b=input().split() #空格切割 转整型后赋值给b
nums=[int(i) for i in b] #一次输入多个参数

为什么不用语句
nums=map(int,input().split())
因为该语句可以一次性输入多个参数,但不能进行字符串的循环读写。当执行完max(nums)后,nums变为空集,无法向下执行。

4、Python代码

代码

n=int(input())
b=input().split()     #空格切割 转整型后赋值给b
nums=[int(i) for i in b]
print(max(nums))
print(min(nums))
print(sum(nums))

知识点

运行结果
在这里插入图片描述

二、字母图形

1、题目

利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数和列数。

输出
输出n行,每个m个字符,为你的图形。

2、样例

输入

5 7

输出

ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC

3、解析

#ord()函数就是用来返回单个字符的ascii值(0-255)或者unicode数值()。

#chr()函数是输入一个整数[0,255]返回其对应的ascii符号,两个函数的作用刚好相反。

#chr()用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
#返回值是当前整数对应的 ASCII 字符。

#abs()返回绝对值。

4、Python代码

代码

m,n=map(int,input().split())    #一次输入多个参数
for i in range(m):
    for j in range(n):
        print(chr(65+abs(i-j)),end = "")
    print("")

运行结果
在这里插入图片描述

三、01字串

1、题目

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。

输入
本试题没有输入。

输出
输出32行,按从小到大的顺序每行一个长度为5的01串。

2、样例

输入

输出

00000
00001
00010
00011
<以下部分省略>

3、解析

#ord()函数就是用来返回单个字符的ascii值(0-255)或者unicode数值()。

#chr()函数是输入一个整数[0,255]返回其对应的ascii符号,两个函数的作用刚好相反。

#chr()用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
#返回值是当前整数对应的 ASCII 字符。

#abs()返回绝对值。

4、Python代码

代码

for i in range(0,32):
    a=bin(i)[2:]      #[2:]表示从第2位一直切到最后,省略了结束索引
    a="0000"+a   #位数不足补零
    print(a[-5:])     #[-5:]表示使用负索引从字符串末尾开始切片,即从右向左看

运行结果
在这里插入图片描述

四、闰年判断

1、题目

给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:

年份是4的倍数而不是100的倍数;
年份是400的倍数。
其他的年份都不是闰年。

输入
输入包含一个整数y,表示当前的年份。

输出
输出一行,如果给定的年份是闰年,则输出yes,否则输出no。
说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。

2、样例

输入

2013

输出

no

输入

2016

输出

yes

3、解析

4、Python代码

代码

n=int(input())
if n%4==0 and n%100!=0 or n%400==0:
    print("yes")
else:
    print("no")

运行结果
在这里插入图片描述
在这里插入图片描述

五、阶乘计算

1、题目

输入一个正整数n,输出n!的值。

其中n!=123*…*n。

算法描述

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。

将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。

首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入
输入包含一个正整数n,n< =1000。

输出
输出n!的准确值。

2、样例

输入

10 

输出

3628800

3、解析

可以直接调用求阶乘的函数进行阶乘计算:
math.factorial(x)
也可以利用for循环进行循环操作。

4、Python代码

代码1

n=int(input())
count=1
for i in range(1,n+1):
    count*=i
print(count)

代码2

import math
print(math.factorial(int(input())))   #math.factorial(x)   返回x的阶乘

运行结果
在这里插入图片描述

六、高精度加法

1、题目

输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

算法描述

由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。

定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。

计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。

最后将C输出即可。

输入
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出
输出一行,表示a + b的值。

2、样例

输入

20100122201001221234567890
2010012220100122

输出

20100122203011233454668012

3、解析

4、Python代码

代码1

a=int(input())
b=int(input())
c=a+b
print(c)

运行结果
在这里插入图片描述

七、Huffuman树

1、题目

Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:

  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。

  2. 重复步骤1,直到{pi}中只剩下一个数。

在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。

本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:

  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。

  2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。

  3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。

  4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。

  5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。

输入
输入的第一行包含一个正整数n(n< =100)。

接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。

输出
输出用这些数构造Huffman树的总费用。

2、样例

输入

5 
5 3 8 2 9

输出

59

3、解析

先将列表进行排序,然后将前两项之和加到列表中,计算此时的费用,再将前两项删掉,然后重新排序,继续循环!

4、Python代码

代码

n=int(input())
str01=list(map(int,input().split()))
total=0
str01.sort()    #先让列表从小到大进行排序,找出最小的两个值
for i in range(len(str01)-1):
    #应在排除前将最小的两项和加到数列末尾
    str01.append(str01[0]+str01[1])
    #记录此时的费用,即此次还未删除
    total+=str01[0]+str01[1]
    #除去前两项最小的
    #由于在第一次删除最小的时候第二个最小的移动到第二位,因此要删除两次才行
    str01.pop(0)
    str01.pop(0)
    #将添加和删除后的数组重新排序,再次循环!
    str01.sort()
print(total)

知识点
str01.append() 给列表末尾增加东西
str01.pop(0) 列表的删除操作,删除第一个元素

运行结果
在这里插入图片描述

八、2n皇后问题

1、题目

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

输入
输入的第一行为一个整数n,表示棋盘的大小。 n小于等于8

接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出
输出一个整数,表示总共有多少种放法。

2、样例

输入

4
1 1 1 1 
1 1 1 1 
1 1 1 1 
1 1 1 1 

输出

2

3、解析

我们可以先放好一个皇后后再放另一个皇后。在图里可以放皇后的格子为1,所以我们可以将不同皇后设置不同的数字来代表,比如2代表黑皇后,3代表白皇后。我们每放一个皇后时先检查他所在列,和两边的对角线有没有放皇后或者说是不能放皇后,判断条件是格子的数是否为一,不为一则是放了皇后或者是不能放皇后。放完最后一行后、我们在dfs函数里判断当前放的皇后是否是将所有的皇后放完了,我们可以用一个数字s代表当前放的棋子,判断条件是s是否等于最后要放的棋子,如果是则放完了计数器count加一,否则继续放棋子,从第一行开始,传下一个代表棋子的数字参数。看到这再看代码相信就明白了。

4、Python代码

代码

n=int(input())
map1=[list(map(int,input().split())) for _ in range(n)]     #模拟棋盘
count=0    #计数器
def dfs(row,n,s,map1):
    global count
    if row==n:     #判断是否是放完了最后一行,注意我的行数是从0开始,0代表第一行
        if s==2:   #2代表黑皇后,3代表白皇后
            dfs(0,n,3,map1)    #黑皇后放完,开始放白皇后
        if s==3:   #全部放完
            count+=1
        return
    for i in range(n):
        if map1[row][i]!=1:     #不为1、说明放了皇后,或者不能皇后
            continue
        if check(row,i,s,map1):
            map1[row][i]=s   #可以放,将格子的数字变为放置对应皇后的数字
            dfs(row+1,n,s,map1)
            map1[row][i]=1    #回溯

def check(row,j,s,map1):
    r=row-1
    k=j-1
    for i in range(row-1,-1,-1):    #检查对应列
        if map1[i][j]==s:
            return False
    while r>=0 and k>=0:     #检查对应左上角
        if map1[r][k]==s:
            return False
        r-=1
        k-=1
    r=row-1
    k=j+1
    while r>=0 and k<n:    #检查对应右上角
        if map1[r][k]==s:
            return False
        r-=1
        k+=1
    return True
dfs(0,n,2,map1)
print(count)

知识点

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值