首页 > 试题广场 >

小红吃药

[编程题]小红吃药
  • 热度指数:136 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红准备买药治病。已知共有n种症状和m种药,第i种药可以治疗一些症状,但可能会导致一些副作用,添加一些新的症状。小红依次服用了一些药,请你告诉小红,当她每次服用一副药时,当前还有多少症状?

输入描述:
第一行输入一个正整数n,代表症状的数量
第二行输入一个长度为n的01串,第i位是'1'代表小红目前有第i个症状,第i位是'0'代表没有该症状。
第三行输入一个正整数m,代表药的数量。
接下来的2*m行,每2行描述一副药:
第一行输入一个长度为n的01串,代表该药能治疗的症状。'1'代表可以治疗,'0'代表不能治疗。
第二行输入一个长度为n的01串,代表该药会产生的副作用。'1'代表会产生该症状,'0'代表不会产生。
接下来的一行,输入一个正整数q,代表小红服用的药数量。
接下来的q行,每行输入一个正整数u,代表小红服用了第u副药。
1\leq n \leq 20
1\leq m,q \leq 10^4
1\leq a_i ,u\leq m

保证每副药副作用产生的症状和该药治疗的症状是不会重复的,即不会存在同一个位置的两个01串都是'1'。


输出描述:
输出q行,每行输入一个正整数,代表当前小红服用药后,身体有多少症状。
示例1

输入

4
0101
3
1100
0010
0101
1000
1001
0000
3
2
3
1

输出

1
0
1

说明

最开始小红有第二个、第四个症状。
开始小红服用了第二副药,治好了这两个症状,但新增了第一个症状。目前症状数量为1。
然后小红服用了第三副药,治好了第一个症状,并没有新增症状。目前症状数量为0。
最后小红服用了第一副药。由于小红没有症状,所以没有治疗,但又新增了第三个症状,目前症状数量为1。
'''
第一行输入一个正整数n,代表症状的数量。
第二行输入一个长度为n的01串,第i位是'1'代表小红目前有第i个症状,第i位是'0'代表没有该症状。
第三行输入一个正整数m,代表药的数量。
接下来的2*m行,每2行描述一副药:
第一行输入一个长度为n的01串,代表该药能治疗的症状。'1'代表可以治疗,'0'代表不能治疗。
第二行输入一个长度为n的01串,代表该药会产生的副作用。'1'代表会产生该症状,'0'代表不会产生。
接下来的一行,输入一个正整数q,代表小红服用的药数量。
接下来的q行,每行输入一个正整数u,代表小红服用了第u副药。
1\leq n \leq 20
1\leq m,q \leq 10^4
1\leq a_i ,u\leq m

保证每副药副作用产生的症状和该药治疗的症状是不会重复的,即不会存在同一个位置的两个01串都是'1'。
'''
n = int(input())
# 将初始症状字符串转换为整数(二进制表示)
current = int(input().strip(), 2)
m = int(input())
medicines = []
for _ in range(m):
    # 治疗效果:将字符串转换为整数(二进制表示)
    treat = int(input().strip(), 2)
    # 副作用:将字符串转换为整数(二进制表示)
    side = int(input().strip(), 2)
    medicines.append((treat, side))

q = int(input())
for _ in range(q):
    u = int(input()) - 1  # 药物编号从0开始
    treat, side = medicines[u]

    # 治疗过程:使用按位与和取反操作移除被治疗的症状
    # ~treat 生成治疗掩码的补码,将treat中为1的位变为0,其余为1
    # current & ~treat 保留current中对应treat为0的位,移除treat为1的位
    current &= ~treat

    # 副作用过程:使用按位或操作添加副作用产生的症状
    # side中为1的位会被添加到current中
    current |= side

    # 统计当前症状数量:转换为二进制字符串后统计'1'的个数
    print(bin(current).count('1'))
发表于 2025-05-17 19:43:36 回复(0)