蓝桥杯训练-芯片测试(day9)

一、题目

有n(2\leq n\leq 20)块芯片,有好有坏,已知好芯片比坏芯片多。每块芯片都能用来测试其他芯片,用好芯片测试其他芯片时,能正确给出被测芯片是好还是坏。用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果。

给出所有芯片的测试结果,问哪些芯片是好芯片。

输入:

输入数据第一行为一个整数n,表示芯片个数。

第二行到第n+1行为n*n的一张表,每行n个数据,表中每个数据为0或1,在这n行中第i行第j列(1\leq i,j\leq n)的数据表示用第i块芯片测试第j块芯片得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果,芯片不能对本身进行测试)。

输出:

按从小到大的顺序输出所有好芯片的编号。

二、例子

输入:

3

1 0 1

0 1 0

1 0 1

输出:

1 3

三、解析

前提条件:

1.假定测试芯片是坏芯片,好芯片输出的0多于坏芯片输出的->被测芯片得到的0不小于一半,就能证明被测芯片是坏的,即每一列中0不少于一半

2..假定测试芯片是好芯片,好芯片输出的1多于坏芯片输出的0->被测芯片得到的1不小于一半,就能证明被测芯片是好的,即每一列中1不少于一半

1 0 1

0 1 0

1 0 1

四、涉及的知识

语法:字符串.split(分隔字符串)

功能:按照指定的分隔符字符串,将字符串划分为多个字符串,并存入列表对象中

注:字符串本身不变,而是得到了一个新的列表对象

 例:切割字符串“i like rabbits”

str = "i like rabbits"
str_list = str.split(" ")
print(str_list)

运行结果:

['i', 'like', 'rabbits']

  • list(map(int,input().split())):将一行以空格形式分隔的输入读入,将他们转换成整数,并以列表形式返回。
    

例:input()函数输入字符串"101",split()函数将其分割成一个字符串列表['1','0','1'],map()函数将列表中每个字符转换成数字类型,即[1,0,1],最后list()函数将map()函数的结果转换成一个列表并返回。

  • 列表.append(元素):将指定元素追加到列表尾部

例:在列表[1,2,3]中追加元素4

list = [1,2,3]
list.append(4)
print(list)

运行结果:

[1, 2, 3, 4]

例:在列表[1,2,3]中追加列表[4,5]

list = [1,2,3]
list.append([4,5])
print(list)

运行结果:

[1, 2, 3, [4, 5]]

五、python代码及逐行解析

法一:

n = int(input())   #输入芯片个数
arr = [list(map(int,input().split())) for i in range(n)]   #输入n行n列的二维列表
tmp = [True] * n   #假设输出n个芯片都为好芯片
for i in range(n): #循环遍历每一行
    count = 0      #计算每一列0的个数,初始个数为0
    for j in range(n):      #循环遍历每一列
        if arr[j][i] == 0:  #如果第j行i列为0
            count += 1      #第j行i列为0,个数加1
        if count >= n / 2:  #判断该列0的个数是否大于所有个数的一半
            tmp[i] = False  #是的话将初始时候假设为好芯片修改为坏芯片
            break
for i in range(n):          #循环每一行
    if tmp[i] == True:      #输出好芯片的行数
        print(i + 1,end=' ')#因为i从0开始计数,习惯从1开始计数,所以i+1

运行结果:

3
1 0 1
0 1 0
1 0 1
1 3 

法二:

n = int(input())       #输入芯片个数
lst = []               #定义一个空列表
for i in range(n):
    lst1 = list(map(int, input().split()))
    lst.append(lst1)   #把lst1放入空列表
for x in range(n):     #循环遍历每一行
    a = b = c = 0      #a用来统计为0的芯片,b用来统计为1的芯片,c用来统计两次检查都为1的芯片
    for y in range(n):        #循环遍历每一列
        if lst[x][y] == 0:    #如果第x行y列为0,存入a中
            a += 1
        elif lst[x][y] == 1:  #如果第x行y列为1,存入b中,并进入下面的判断
            b += 1
            if lst[x] == lst[y]:   #如果x芯片的检测结果和y芯片的检测结果一样,则存入c中
                c += 1
    if (b > a and b == c):         #检测一行后,如果1的个数大于0的个数,并且b=c,输出该行的行号
        print(x + 1, end=' ')

运行结果:

3
1 0 1
0 1 0
1 0 1
1 3  

  • 42
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值