python 基础知识点(蓝桥杯python科目个人复习计划21)

文章讨论了三个编程题目,涉及糖果分配策略、最小战斗力差距计算以及在零花钱限制下进行的操作次数优化。这些问题涉及IT技术中的算法设计和数据结构应用。
摘要由CSDN通过智能技术生成

 今日复习内容:以做题为主

第一题:分糖果

题目描述:

最近暑期算法特训班的同学表现出色,她们的老师决定奖励她们,老师购买了n种不同种类的糖果,用小写的阿拉伯字母表示,每个糖果必须分给一个同学,并且每个同学至少要分到一个糖果,同学们的开心程度定义为 她们所分到的糖果组成的字符串s[i]的字典序,;老师希望同学们的开心程度尽量小,因此她要找到一种方案,使得所有糖果组成的 字符串中字典序最大的字符串尽量小,请输出字典序最小可能的Max[s[1],s[2].......s[x]]。

输入描述:

第一行输入两个整数n和x,表示有n个糖果和x个同学

第二行输入一个长度为n的字符串S,s[i]表示第i个糖果的种类

数据保证:1 <= n <= 10^6 , 1 <= x <= n,  ,s[i] = ['a','z']

输出描述:

输出一个字符串,为所有糖果组成的字符串中字典序最大的字符串最小的可能值

参考代码:

import math
n,x = map(int,input().split()) # n 是糖果的数目,x 是同学的数目
S = list(input()) # S 是列表,用来存放所有的糖果
S.sort() # 对列表进行排序
S = [''] + S
if S[1] == S[x]:
    if S[x+1] == S[-1]:
        print(S[x],end='')
        for i in range(x+1,x+math.ceil((n-x)/x)+1):
            print(S[i],end='')
    else:
        print(''.join(S[x:]))
else:
    print(S[x])

我做这个题的时候,不知道为啥,pycharm里面运行不出来,但蓝桥杯那里是通过的,所以这个代码是没问题的。 我看了好久了,不知道哪里有问题,但是答案是正确的。


第二题:最小战斗化差距

题目描述:

小蓝是机甲战队的队长,他手下共有n名队员,每名队员都有一个战斗力值Wi,现在他需要将这n名队员分成两组a和b,分组必须满足以下条件:

每个队员都属于a组或b组;

a组和b组都不为空;

战斗力差距最小。

战斗力差距的计算公式为|max(a) - min(b)|,其中max(a)表示a组中战斗力最强的,min(b)表示b组中战斗力最弱的。

请你计算出可以得到的最小战斗力差距。

输入格式:

第一行输入一个整数n,表示队员个数;

第二行输入n个整数值W1,W2...Wn,表示每个队员的战斗力值;

数据范围保证:2 <= n <= 10^5 , 1 <= Wi <= 10^9

输出格式:

输出一个整数,表示可以得到的最小战斗力差距。

参考答案:

import math
n = int(input())  # 队员的个数
li = list(map(int,input().split()))  # 队员的战斗力值
li.sort()
res = 1e9
for i in range(0,n-1):
    res = min(res,li[i+1] - li[i])
print(res)

运行结果:

 

这个题和上一个题就一个类型,有不清楚的可以问我的。(思路很清晰,但是不知道咋写)


第三题:小蓝的零花钱

题目描述:

小蓝和小桥正在玩一个游戏 ,他们有一个长度为n的序列,其中既有奇数又有偶数,且偶数和奇数的 数量相等;

小蓝有一些零花钱,他想用这些钱来做一些特殊的操作:他在序列中选择一个位置,然后在这个位置上将序列分成两段,要求每一段中偶数和奇数的数量都相等,小蓝想用他的零花钱尽可能多的做这个操作,但每次操作都需要有代价。换而言之,每次选取位置相当于对序列进行切割,每次的代价是需要花费切割序列两端的元素的差的绝对值。小蓝想知道,在他的预算范围内,最多能进行几次操作?

输入描述:

第一行输入两个数n和B(2 <= n <= 100 , 1 <= B <= 100),表示序列的长度和小蓝拥有的零花钱数;

第二行包括n个整数a1,a2.....an(1 <= ai <= 100),表示给定的序列(保证此序列中奇数的个数等于偶数的个数);

输出格式:

输出一个整数,表示在他的预算范围内,最多能进行几次操作

参考答案:

n,B = map(int,input().split())
li = list(map(int,input().split()))
tot = 0
cnt = []
for i in range(len(li) - 1):
    if li[i] % 2 == 0:
        tot += 1
    else:
        tot -= 1
    if tot == 0:
        cnt.append(li[i+1] - li[i])
cnt.sort()
ans = 0
for c in cnt:
    if c <= B:
        ans += 1
        B -= c
    else:
        break
print(ans)

运行结果:

 

OK,最近期末复习,时间紧,需要几天 才能写完一篇,就这样吧,下次继续!

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值