蓝桥杯之python实现芯片测试

文章目录

  • 一、问题描述
  • 二、输入输出格式
  • 三、输出
  • 四、代码
  • 五、另一种思路

一、问题描述

有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
  每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
  给出所有芯片的测试结果,问哪些芯片是好芯片。

二、输入输出格式

输入格式

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

输出格式

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

样例输入

3
1 0 1
0 1 0
1 0 1

样例输出

1 3

三、分析

对于上述样例:

首先假设第一个芯片是好的,用第一个芯片去测试第二个和第三个芯片,将测试结果分别放在good与bad里;再用第二个芯片去测试其他芯片,在测试之前先判断这个芯片在之前的判断中是否是坏的,如果是坏的,则直接跳过此芯片的测试,如果在之前的测试中不是坏的则假设此芯片是好的,用第二芯片去测试其余芯片,在测试过程中如果与之前测的结果有矛盾,则说明第二个芯片是坏的,将此芯片从good中除去,依次用同样的方法用第三个芯片去 测试其余芯片,最后将good列表里的结果输出。

四.代码

代码如下:
n=int(input())
list1= [list(map(int,input().split())) for j in range(n)]
Good=[]#放好芯片
Bad=[]#放坏芯片
for i in range(n):
    if i in Bad:#如果是坏芯片,直接跳过,不测
            continue
    else:#如果是好的芯片且不在好的芯片的列表中,将此芯片放入good的列表中
        if i not in Good:
            Good.append(i)
        for j in range(n):#用i芯片来测试其他芯片的好坏,并将好芯片放入good中,将坏芯片放入bad中
            if i !=j:#自己不测自己
                if (list1[i][j]==1) and (j not in Good):
                    Good.append(j)
                if (list1[i][j]==0) and (j not in Bad):
                    Bad.append(j)
                if (list1[i][j]==1) and (j in Bad):#如果i测的j芯片是好的,但是j芯片已经在坏芯片的行列中,则说明i芯片是好芯片的假设是错的,将i芯片移出好芯片的行列
                    Good.remove(i)
                    break
                if (list1[i][j]==0) and (j in Good):#如果i测j芯片是坏的但是j在好芯片的行列中也说明i是好芯片的假设是错的
                    Good.remove(i)
                    break
for i in Good:
    print(i+1,'',end='')

五.另一种思路

          这个方法更简单更好理解一些:

        依次用第j个芯片去测试第i个芯片,如果有大于一半的芯片对i芯片的测试结果都是好的,那么则认定i芯片是好的,输出i芯片(因为python索引从0开始,因此最后输出时需要加一)。

n = int(input())
s = []
for i in range(n):
    s.append(input().split())
for i in range(0,n):
    flag = 0
    for j in range(n):
        if s[j][i] == '1':
            flag += 1
        if flag >= n/2:
            print(i+1,'',end='')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值