金-山-笔-试-A-卷

p1

小红有很多小写字母。她准备用一些字母构造一个单词。已知一个合法的单词不能有两个辅音相邻,例如“cat”是合法的单词,但“than"”不是合法的单词。小红想知道,自己能构造的最大长度的单词有多长?注:元音字母有”a、e、i、0、u"五种。

输入描述

一个只包含小写字母的字符串,长度不超过100000

输出描述

小红可以组成的最大单词长度

eg1:
输入:
aaatra
输出:
6
eg2:
输入:
tgqa
输出:
3

解:

思路:

就是先计算出字符串中的元音个数,然后满足题意的最长字符串的长度就是元音字符数加上(辅音字符数和元音字符数+1中的小的)

是加一!!!!!!!

### 公式法
(网上查的公式)
(计算出字符串中的所有元音个数,推出一个公式 (max_length = 元音个数+min(辅音个数,元音个数-1)))
s = input()
n = len(s)
count = 0
fuanyin_s = 'aeiou'###元音字符串
for i in s:
  if i in fuanyin_s:
    count +=1
print(count + min(n-count,count+1))

p2

某次篮球比赛前,需要将站成一排的n名球员分为两队(两队人数可以不同),每名球员的能力值为 ai。 有两名教练轮流挑选队员,第一个教练先挑选。每位教练每次选人时,都会选择当前剩余的所有人中,能力值最大的那一个。当选择一个人后,会将他左右两侧各m个人一起挑选走 (若某一侧可选的人数不够m人,则将这一侧能选的人都选上)。请输出此规则下,分到两队的具体成员情况。

输入描述

第一行两个正整数,球员人数n,一起挑走的球员左右各m人;

第二行几个正整数,每名球员的能力值 ai。

在这里插入图片描述

输出描述

一个长度为n的字符串,第i位只包含 A和B,A表示第名球员被挑选到第一个队伍,B代表第二个队伍。

eg1:
输入:
7 1 
3 6 1 7 2 5 4 
输出:
BBAAABA
说明:
A先挑选7,按规则带走7的两边各一人1和2,剩余的球员为3 6 5 4;
B挑选6,按规则带走6的两边各一人3和5,剩余的球员为4;
A挑选4,组队结束
eg2:
输入:
10 2 
4 8 9 10 7 6 5 3 2 1 
输出:
BAAAAABBBA
说明:
A先挑选10,按规则带走10的左边的8 9和右边的7 6,剩余的球员为4 5 3 2 1;
B挑选5,按规则带走5的左边的4和右边的3 2,剩余的球员为1,
A挑选1,组队结束。

思路

就是模拟过程。首先创建user变量,后面每一次教练选人就加一,用奇偶性来判断是A还是B,其次一个select变量,选择次数,来控制循环的结束,最后一个result数组来保存结果,为了能确定当前的队员是否被选过,可以用能力ai取值范围的数进行初始化,这里使用0。

开始遍历,首先while循环控制结束,因为我们最多选择A次,也就是选手个数。然后先选择当前数组的最大元素,以及对应坐标。然后初始化一个变量cnt_left来表示左侧已经选了几个(这边左侧是B加一个,加的1是当前的最大值,可以放在右侧一样),同时用i记录下当前最大值的坐标,因为后续还要再使用一次,防止被更改。

进行左侧选择的循环,首先是终止条件(如果选满,或者到了数组边界没得选就停止),然后根据result数组判断当前索引的元素是否被选择过,没被选择过就根据user的奇偶性判断用A还是B,最后要把capacity数组就是题目输入的数组当前索引的元素改为-1,这样不影响下一次选择最大值,同时cur_left+1,select+1,最后在if外,i-1,因为已经遍历了个元素了。然后再对右侧,同理,只不过i+1。最后结束左右两侧的选择后就要user+1了,继续重复循环即可。

直接硬解模拟:
A,B = map(int,input().split())
# print(A,B)
capacity = list(map(int,input().split()))###得到队员能力数组
user = 0#判断是教练A还是B
select = 0#选择数
# print(A)
result = [0] * A###结果集,初始为零,遇到零表示没选择过,A或B表示选择过了
while select < A:
    #pop_array = []###一个记录选择哪些元素的索引的数组,用于一轮结束后的删除
    max_cap = max(capacity)
    index_max = capacity.index(max_cap)
    # print(index_max)
    #先选左侧的m+1个(加的1是当前的最大值)
    cnt_left = 0 ##记录选择了几个
    i = index_max
    while cnt_left < B+1 and i >= 0:
        if result[i] == 0:
            if user%2 == 0:
                result[i] = 'A'
            else :
                result[i] = 'B'
            capacity[i] = -1###选择的变为-1,这样不影响下一次选择最大值
            cnt_left += 1
            select += 1
        i -= 1
    ###再选右侧的m个
    cnt_right = 0
    i = index_max+1
    while cnt_right < B and i < A:
        if result[i] == 0:
            if user%2 == 0:
                result[i] = 'A'
            else:
                result[i] = 'B'
            capacity[i] = -1
            cnt_right += 1
            select += 1
        i += 1
    ###删除所选择的元素
    # pop_array.sort(reverse = True)###要倒序,不然会错,因为pop删完后元素尺寸变小了
    # print(pop_array)
    # for num in pop_array:
    #     # print(capacity,num)
    #     capacity.pop(num)
    # print(capacity)
    user += 1
print(''.join(result))

p3

已知山体上的雪球向下滚动时,雪球每向下滚动1的距离,体积会膨胀x倍。

例如,海拔高度为2的、初始大小为1雪球,当它滚到海拔高度为0的地面时,若x=5其大小会变成1 * 5 * 5=25。

现在每个海拔为 i 的高度都生成了ai个大小为1的雪球。当它们全部滚动到地面时请你求出所有雪球的大小总和。答案对10^9+7取模。

输入描述

在第一行中,给出山的高度H和雪球增加的程度 x。 在第二行到H+1行表示在山上生成的雪球数量,其中第 i + 1行的数字表示在高度为 i 处制成的雪球的数量 为ai。

在这里插入图片描述

输出描述

输出从山上滚下的所有雪球的大小总和,答案对10^9+7取模。

eg1:
输入:
4 5
1
3
2
4

输出:
2830

说明:
通过累加计算全部雪球的大小总和为1x5+3x25+2x125+4x625=2830
eg2:
输入:
3 1
1
2
3

输出:
6

说明:
通过累加计算全部雪球的大小总和为1X1 + 2X1 + 3x1 = 6

解:

思路

这题思路好像没啥,好像网上说要分别让两个地方对(1e9+7)取模就行,这题好像就是直接算会报错,我就根据给的参考试了试,也不知道能AC嘛,反正测试用例没问题

h,x = map(int,input().split())
snowball = []
for i in range(h):
    tmp = int(input())
    snowball.append(tmp)
MOD = int(1e9 + 7)
result = 0
f = 1###初始化一个1,每一次循环乘以一次膨胀倍数X
for i in range(h):
    f = (f*x)%MOD###取模处
    result = (result + f*snowball[i])%MOD###取模处
print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值