A.小苯的选择题

题目详情:

小苯正在进行《C++ 程序设计》这门课的期末考试。考试中有一道多选题小苯并不会做,因此他蒙了个答案上去。身为阅卷老师的你知道本题的答案是:"ABD"

现在已知小苯蒙的答案(以大写英文字符串 s 的形式给出),请你阅卷给出正确的得分,规则如下:

  • 全对得 4 分。
  • 选对但选不全得 2 分。
  • 否则得 0 分。

输入描述:

在一行上输入一个非空字符串 s,表示小苯的答案(保证 s 中仅包含大写英文字母 A,B,C,D,且一定按严格升序给出,即不会出现 BADAA 这样的情况)。

输出描述:

输出一个整数,表示小苯的得分。

代码:

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。操作可以进行任意多次。小苯想知道,通过若干次操作,能够得到的字典序最小的序列是什么。

【名词解释】

序列的字典序比较:从左到右逐个比较两个序列的元素。如果在某个位置上元素不同,比较这两个元素的大小,元素小的序列字典序也小。如果一直比较到其中一个序列结束,则长度较短的序列字典序更小。

输入描述:

每个测试文件均包含多组测试数据。

  1. 第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。

  2. 每组测试数据描述如下:

    • 第一行输入一个整数 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)的地雷(如果相应位置存在地雷且尚未被引爆)。这个过程会一直连锁反应下去,直到没有新的地雷被引爆。

小苯希望通过手动引爆某些地雷,使得所有地雷最终都被引爆。他的目标是最小化手动引爆的总花费。你的任务是计算这个最小总花费。

输入描述:

每个测试文件均包含多组测试数据。

  1. 第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。

  2. 每组测试数据描述如下:

    • 第一行输入一个整数 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),对两个整数的二进制表示按位进行异或运算。

输入描述:

每个测试文件均包含多组测试数据。

  1. 第一行输入一个整数 T (1≤T≤10^4) 代表数据组数。

  2. 每组测试数据描述如下:

    • 第一行输入两个整数 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())
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐