牛客周赛 Round 125(ABCD)
地雷之间可以相互引炸:一旦某个位置 i 的地雷被引爆(无论是手动引爆还是被相邻地雷引爆),它会立即引爆其左右相邻(即位置 i−1 和 i+1)的地雷(如果相应位置存在地雷且尚未被引爆)。他可以对字符串 A 进行任意次操作,每次操作选择相邻的两个字符 ci 和 ci+1,将它们替换为它们的异或值(即 ci⊕ci+1),从而字符串长度减少 1。定义序列的一个「峰值」为满足 1<i<n 且 ai
A.小苯的选择题
题目详情:
小苯正在进行《C++ 程序设计》这门课的期末考试。考试中有一道多选题小苯并不会做,因此他蒙了个答案上去。身为阅卷老师的你知道本题的答案是:"ABD"。
现在已知小苯蒙的答案(以大写英文字符串 s 的形式给出),请你阅卷给出正确的得分,规则如下:
- 全对得 4 分。
- 选对但选不全得 2 分。
- 否则得 0 分。
输入描述:
在一行上输入一个非空字符串 s,表示小苯的答案(保证 s 中仅包含大写英文字母 A,B,C,D,且一定按严格升序给出,即不会出现 BAD、AA 这样的情况)。
输出描述:
输出一个整数,表示小苯的得分。
代码:
aSet=set(input())
if "C" in aSet:
print(0)
elif len(aSet)==3:
print(4)
else:
print(2)
B.小苯的峰值序列
题目详情:
给定一个长度为 n 的整数序列 a1,a2,…,an。定义序列的一个「峰值」为满足 1<i<n 且 ai>max(ai−1,ai+1) 的位置 i。
每次操作,小苯可以选择一个「峰值」位置 i,然后将 ai 减少 1。操作可以进行任意多次。小苯想知道,通过若干次操作,能够得到的字典序最小的序列是什么。
【名词解释】
序列的字典序比较:从左到右逐个比较两个序列的元素。如果在某个位置上元素不同,比较这两个元素的大小,元素小的序列字典序也小。如果一直比较到其中一个序列结束,则长度较短的序列字典序更小。
输入描述:
每个测试文件均包含多组测试数据。
-
第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。
-
每组测试数据描述如下:
-
第一行输入一个整数 n (1≤n≤2×10^5),表示序列的长度。
-
第二行输入 n 个整数 a1,a2,…,an (1≤ai≤10^9),表示序列中的各个元素。
-
除此之外,保证单个测试文件的 n 之和不超过 2×10^5。
输出描述:
对于每一组测试数据,新起一行输出 n 个整数,表示能够得到的字典序最小的序列。
代码:
def demo():
n=int(input())
aList=[int(x) for x in input().split()]
for i in range(1,n-1):
if aList[i]>max(aList[i-1],aList[i+1]):
aList[i]=max(aList[i-1],aList[i+1])
print(" ".join(map(str,aList)))
t=int(input())
while t:
t-=1
demo()
C.小苯排雷
题目详情:
小苯面前有一排 n 个连续的格子,从左到右编号为 1 到 n。某些格子中埋有地雷。
每个地雷有一个手动引爆花费 ai:
- 如果 ai>0,表示第 i 个格子中埋有地雷,且手动引爆它需要花费 ai;
- 如果 ai=0,表示该格子没有地雷。
地雷之间可以相互引炸:一旦某个位置 i 的地雷被引爆(无论是手动引爆还是被相邻地雷引爆),它会立即引爆其左右相邻(即位置 i−1 和 i+1)的地雷(如果相应位置存在地雷且尚未被引爆)。这个过程会一直连锁反应下去,直到没有新的地雷被引爆。
小苯希望通过手动引爆某些地雷,使得所有地雷最终都被引爆。他的目标是最小化手动引爆的总花费。你的任务是计算这个最小总花费。
输入描述:
每个测试文件均包含多组测试数据。
-
第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。
-
每组测试数据描述如下:
-
第一行输入一个整数 n (1≤n≤3×10^5),表示格子的数量。
-
第二行输入 n 个整数 a1,a2,…,an (0≤ai≤10^9),表示每个格子中埋有地雷的手动引爆花费。
-
除此之外,保证单个测试文件的 n 之和不超过 3×10^5。
输出描述:
对于每一组测试数据,新起一行输出一个整数,表示引爆所有地雷的最小总花费。
代码:
def demo():
n=int(input())
aList=[int(x) for x in input().split()]
l=1
bList=[]
ans=0
for i in range(n):
if aList[i]==0:
if bList:
ans+=min(bList)
bList=[]
continue
bList.append(aList[i])
if aList[-1]!=0:
ans+=min(bList)
print(ans)
t=int(input())
while t:
t-=1
demo()
D.小苯的01合并
题目详情:
小苯有两个长度分别为 n 和 m 的、仅由字符 '0' 和 '1' 组成的字符串 A 和 B,下标从 1 开始。
他可以对字符串 A 进行任意次操作,每次操作选择相邻的两个字符 ci 和 ci+1,将它们替换为它们的异或值(即 ci⊕ci+1),从而字符串长度减少 1。例如,对于 A="0110",选择前两个字符 "01" 替换为 0⊕1=1,得到新字符串 "110"。
你的任务就是判断,是否可以通过若干次(可以是零次)操作,将字符串 A 变成字符串 B?
【名词解释】
⊕:指位运算中的按位异或(Bitwise XOR),对两个整数的二进制表示按位进行异或运算。
输入描述:
每个测试文件均包含多组测试数据。
-
第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。
-
每组测试数据描述如下:
-
第一行输入两个整数 n,m (1≤m≤n≤5×10^5),表示字符串 A 和 B 的长度。
-
第二行输入一个长度为 n 的字符串 A,只包含字符
'0'和'1'。 -
第三行输入一个长度为 m 的字符串 B,只包含字符
'0'和'1'。
-
除此之外,保证单个测试文件的 n 之和不超过 5×10^5。
输出描述:
对于每组数据,如果可以将 A 变成 B,输出 YES,否则输出 NO。
代码:
def demo():
n,m=map(int,input().split())
aList=[int(x) for x in input().strip()]
bList=[int(x) for x in input().strip()]
i,j=0,0
s=0
while i<n and j<m:
s=s^aList[i]
if s==bList[j]:
j+=1
s=0
i+=1
while i < n:
s ^= aList[i]
i += 1
if j==m and s==0:
return "YES"
else:
return "NO"
t=int(input())
while t:
t-=1
print(demo())更多推荐


所有评论(0)