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)