有n()块芯片,有好有坏,已知好芯片比坏芯片多。每块芯片都能用来测试其他芯片,用好芯片测试其他芯片时,能正确给出被测芯片是好还是坏。用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入:
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据,表中每个数据为0或1,在这n行中第i行第j列()的数据表示用第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()函数的结果转换成一个列表并返回。
例:在列表[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]]
法一:
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