[蓝桥杯] 自选 (Python 实现)

1、

问题描述
在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。
例如,1234567 写成 1,234,567。
例如,17179869184 写成 17,179,869,184。
给定一个整数,请将这个整数增加分割符后输出。

输入格式
 输入一行包含一个整数 v。
输出格式
 输出增加分割符后的整数。

样例输入
1234567
样例输出
1,234,567

样例输入
17179869184
样例输出
17,179,869,184

数据规模和约定
 对于 50% 的评测用例,0 <= v < 10^9 (10的9次方)。
 对于所有评测用例,0 <= v < 10^18 (10的18次方)。

代码:

nums=input()
count=0
for x in range(len(nums)-1,0,-1):
    count+=1
    if count%3==0:
        nums=','.join([nums[:x],nums[x:]])
print(nums)

2、

问题描述
斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。
根据以上定义,我们容易计算出斐波那契数列的前几项依次是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ……
现在请你计算斐波那契数列第N项是奇数还是偶数?

输入格式
 输入的包含一个整数N。
输出格式
 如果是奇数输出1,是偶数输出0。

样例输入
10
样例输出
1
提示
 找规律。
数据规模和约定
 对于所有评测用例,1 <= N <= 1000000000。

代码:

n = int(input())
def fib(n):
    if n==1 or n==2 :
        return 1
    else:
        return fib(n-1)+fib(n-2)
res=fib(n)
print(res%2)
#当n很大的时候就需要看他的规律了。 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
#根据上面的一串结果可看出,当n为三的整数倍的时候结果为偶数。
n=int(input())
if n%3==0:
    print(0)
else:
    print(1)

3、

【问题描述】
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。

【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。

【输出格式】
输出一行包含一个整数,表示答案。

【样例输入】
5
1 2 5 3 5

【样例输出】
2

代码:

n=int(input())
lis=input().split(" ")
for x in range(len(lis)):
    lis[x]=int(lis[x])
res=set()#将res设置为集合,避免重复
for a in range(len(lis)-2):
    l=lis[a]#第一个数字
    for b in range(a+1,len(lis)-1):
        cen=lis[b]#中心数字
        for c in range(b+1,len(lis)):
            r=lis[c]#最后一个数字
            if l<cen<r:
                res.add(cen)#如果符合递增三元组,则将当前中心添加到res中
                break
print(len(res))            

结果:
在这里插入图片描述

4、

【问题描述】
由1对括号,可以组成一种合法括号序列:()。
由2对括号,可以组成两种合法括号序列:()()、(())。
由4对括号组成的合法括号序列一共有多少种?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

代码:

import itertools
num=['(','(','(','(',')',')',')',')']
i=set(itertools.permutations(num,8))
res=0
for x in i:
    check=[]
    for a in range(8) :
        if x[a]=='(':
            check.append(x[a])
        elif len(check)!=0 :
            check.pop()
        else:
            break
        if a==7 and len(check)==0:
            res+=1
print(res)            

结果:14

5、
题目:

【问题描述】
给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。
例如,lanqiao会变成odqtldr。

【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。

【输出格式】
输出一行,表示加密后的密文。

【样例输入】
lanqiao

【样例输出】
odqtldr

【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。


代码:

word=[0]+list('abcdefghijklmnopqrstuvwxyz')
s=list(input())
res=''
for xx in s:
    res+=word[(word.index(xx)+3)%26]
print(res)

结果:
在这里插入图片描述
6、
题目:

【问题描述】
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
【输入格式】
输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
第二行包含两个整数 r, c,表示要求的行号和列号。
【输出格式】
输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
【样例输入】
4 5
2 2
【样例输出】
15
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。


代码:

y_,x_=map(int,input().split(' '))
r,c=map(int,input().split(' '))
num=1
res=[[0]*x_ for i in range(y_)]
move=[(0,1),(1,0),(0,-1),(-1,0)]
move_count=0
up,down,left,right=0,y_-1,0,x_-1
y,x=0,0
while num<y_*x_+1:
    res[y][x]=num
    num+=1
    if x==right and move_count==0:
        move_count+=1
        up+=1
    elif y==down and move_count==1:
        move_count+=1
        right-=1
    elif x==left and move_count==2:
        down-=1
        move_count+=1
    elif y==up and move_count==3:
        left+=1
        move_count+=1
    move_count%=4
    y+=move[move_count][0]
    x+=move[move_count][1]
print(res[r-1][c-1])

结果:
在这里插入图片描述
7、

【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd” 的格式写成一个8 位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202 即2021年12月2日。也有人表示20200202 并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100 年后就能遇到下一个ABABBABA 型的回文日期:21211212 即2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数N,表示日期。
【输出格式】
输出两行,每行1 个八位数。第一行表示下一个回文日期,第二行表示下
一个ABABBABA 型的回文日期。
【样例输入】
20200202
1
【样例输出】
20211202
21211212

代码:

res1=[]
res2=[]
year=int(input())
for x in range(year+1,99999999):#从输入的那一年之后的年份开始,对于此代码当从20200202开始的时候就会输出两个输入。
    a=list(str(x))
    if a[:4][::-1]==a[4:]:
        res1.append(x)
        if a[0]==a[2]and a[1]==a[3]:
            res2.append(x)
    if len(res2)==1:
        break
print(res1[0])
print(res2[0])

结果:
在这里插入图片描述
8、
题目:

杂货铺老板一共有N件物品,每件物品具有ABC三种属性中的一种或多种。从杂货铺老板处购得一件物品需要支付相应的代价。
 现在你需要计算出如何购买物品,可以使得ABC三种属性中的每一种都在至少一件购买的物品中出现,并且支付的总代价最小。
输入格式
 输入第一行包含一个整数N。
 以下N行,每行包含一个整数C和一个只包含"ABC"的字符串,代表购得该物品的代价和其具有的属性。
输出格式
 输出一个整数,代表最小的代价。如果无论如何凑不齐ABC三种属性,输出-1。
样例输入
5
10 A
9 BC
11 CA
4 A
5 B
样例输出
13
数据规模和约定
 对于50%的评测用例,1 <= N <= 20
 对于所有评测用例,1 <= N <= 1000, 1 <= C <= 100000

代码:

import itertools
n=int(input())
wares=[]
for _ in range(n):
    price,attribute=input().split(' ')
    wares.append([int(price),attribute])
def check(k):
    che=list(itertools.permutations(wares,k))
    cost=[]
    for x in che:
        s=''
        c=0
        for i in x:
            s+=i[1]
            c+=i[0]      
        s,count=list(s),0
        for j in ['A','B','C']:
            if j in s:
                count+=1
        if count==3 and c!=0 :
            cost.append(c)   
    if cost:    
        return min(cost)
    else:
        return 0
res=[]
for k in range(1,n+1):
    if check(k)!=0:
        res.append(check(k))
print(min(res))

结果:
在这里插入图片描述

9、
题目:

给定一个序列 (a_1, a_2, …, a_n), 它的一个上升子序列是指从序列中取出一些元素,按照原来的顺序排列后,是单调递增的序列。
 例如,对于序列 (3, 2, 7, 6, 7),取出下标为 2, 4, 5 的元素 a_2, a_4, a_5,即 2, 6, 7,是一个上升子序列。
 在这个序列中,有 7 个长度为 2 的上升子序列,
 例如1. 下标 1, 3 对应的 3, 7;
  2. 下标 1, 4 对应的 3, 6;
  3. 下标 1, 5 对应的 3, 7;
  4. 下标 2, 3 对应的 2, 7;
  5. 下标 2, 4 对应的 2, 6;
  6. 下标 2, 5 对应的 2, 7;
  7. 下标 4, 5 对应的 6, 7。
注意,可能有下标不同但对应数值相同的上升子序列,他们应当算成不同的上升子序列。
  给定序列,请问序列中一共有多少个长度为 k 的上升子序列。
输入格式
  输入第一行包含两个整数 n, k,表示序列的长度和上升子序列的长度。
  第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的序列。
输出格式
  输出一行,包含一个整数,表示长度为 k 的上升子序列的数量,答案可能很大,请输出答案除以 1000007 的余数。
  
样例输入
5 2
3 2 7 6 7
样例输出
7
数据规模和约定
 对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 100。
 对于 50% 的评测用例,1 <= n <= 100, 0 <= a_i <= 1000。
 对于所有评测用例,1 <= n <= 1000, 1 <= k <= 10, 0 <= a_i <= 10000。

代码:

import itertools
n,k=map(int,input().split(' '))
nums=input().split(" ")
for x in range(len(nums)):
    nums[x]=int(nums[x])
test=list(itertools.combinations(nums,k))
res=0
for x in test:
    res+=1
    for a in range(len(x)-1):
        if x[a]>=x[a+1]:
            res-=1
            break
print(res)

结果:
在这里插入图片描述

10、
题目:

小明买了块高端大气上档次的电子手表,他正准备调时间呢。
在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟。
大家都知道,手表只有一个按钮可以把当前的数加一。在调分钟的时候,如果当前显示的数是 0 ,那么按一下按钮就会变成 1,再按一次变成 2 。如果当前的数是 n - 1,按一次后会变成 0 。
作为强迫症患者,小明一定要把手表的时间调对。如果手表上的时间比当前时间多1,则要按 n - 1 次加一按钮才能调回正确时间。
小明想,如果手表可以再添加一个按钮,表示把当前的数加 k 该多好啊……
他想知道,如果有了这个 +k 按钮,按照最优策略按键,从任意一个分钟数调到另外任意一个分钟数最多要按多少次。
注意,按 +k 按钮时,如果加k后数字超过n-1,则会对n取模。
比如,n=10, k=6 的时候,假设当前时间是0,连按2次 +k 按钮,则调为2。
「输入格式」
一行两个整数 n, k ,意义如题。
「输出格式」
一行一个整数
表示:按照最优策略按键,从一个时间调到另一个时间最多要按多少次。
「样例输入」
5 3
「样例输出」
2
「样例解释」
如果时间正确则按0次。否则要按的次数和操作系列之间的关系如下:
1:+1
2:+1, +1
3:+3
4:+3, +1
「数据范围」
对于 30% 的数据 0 < k < n <= 5
对于 60% 的数据 0 < k < n <= 100
对于 100% 的数据 0 < k < n <= 100000
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

代码:

n,k=map(int,input().split(' '))
one,t=0,0
res=[]
for x in range(1,n):
#如果当前的数不是新键的周期的整数倍就一个一个累加,如果正好是一个周期那就直接按下新键。
    if x%k!=0:
        one+=1
    else:
        one=0
        t+=1
    res.append(t+one)
print(max(res))

结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值