每日一题——芯片测试

学习目标:

每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢?

啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头)。

明日复明日,明日何其多?不要等明天啦,和小编一起,每天睡前一道算法题,不仅解决你一天的空虚,更能助你安心入眠,远离熬夜。还能学到一点算法知识。不要小看这些知识哦,不积跬步无以至千里,不积小流无以成江海。每位大佬都不是一夜成名,都是从小白做起,日积月累,终成大佬,和小编一起,每日一题,走向大佬之路吧!


学习内容:

我们的题基本都是一些较为基础,适合日(睡)常(前)看的题,不会让你一眼就看出答案,是稍稍一点脚就能摸到头绪,但是在想的过程中又一时不知如何实现,再一想,又柳暗花明,最终跟着小编的思路一起解决问题,有不同思路可以发在评论区,一起讨论。“你若在,我必回”。


接下来让我们看一下今天的题目:

  有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


好,看完题目,相信你心里已经有了初步的分析,没有的话也没关系,再看一遍嘛,return一下,让我们来一起分析下

第一,输入与输出。ok,很简单,直接输入一个n,定义一个n*n的二维数组。

int n;
scanf("%d",&n);
int num[n][n];
for(i=0;i<n;i++){
	for(j=0;j<n;j++){
		scanf("%d",&num[i][j]);
	}
}

但还是有一个非常的小细节,就是输入时的&,千万不要小看它,小编忘记写了,运行出的结果每次就输出第一个,我还以为是输出判断的问题(流泪)。天下大事,必作于细。代码也是如此,每一个微小的失误都会造成我们代码的错误。

第二,已知好的芯片是可以正确判断其他芯片的好坏,坏芯片是随机判断,在对自身判断时都是好的(就像我们一样,看自己都是最优秀的那个^^)。并且,好芯片比坏芯片多。小编的思路就是通过这一点进行判断:好芯片的判断都是对的,具有唯一性,并且多。那么是不是可以说明好芯片的测试结果都相同呢,即对每一个芯片测试结果相同,并且相同结果占大多数。像例子中第一行和第三行都是1 0 1。所以,通过相同数字占大多数,并且是好芯片这一结论,可以用来判断好芯片。

第三,将每个芯片对应的判断结果存放在一个数中,像1 0 1变成101,可以便于统计,可定义一个一维数组test[n]。

test[i]=test[i]*10+num[i][j];

在遍历中就能完成对test的计算。但千万不要忘记初始话数组,c语言不会默认数组都是0,需要你自己定义。

第四,找到大多数的那个数。

int most,ans=0,t=0;
while(ans<n/2){
	ans=0;//没有找到后进行清0
	most=test[t++];
	for(i=0;i<n;i++){
		if(test[i]==most){
			ans++;
		}
	}	
}

ans用来记录某个数出现次数,当它>n/2时说明找到了,并存放在most中。

第五,test数组中的每个数和most进行比较,相同说明第(i+1)个芯片是好的,并输出。

完整代码如下:

#include<stdio.h>
int main() {
	int n;
	scanf("%d",&n);
	int num[n][n],test[n],i,j;
	for(i=0;i<n;i++){
		test[i]=0;
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&num[i][j]);
			test[i]=test[i]*10+num[i][j];
		}
	}
	int most,ans=0,t=0;
	while(ans<n/2){
		ans=0;
		most=test[t++];
		for(i=0;i<n;i++){
			if(test[i]==most){
				ans++;
			}
		}	
	}
	for(i=0;i<n;i++){
		if(test[i]==most){
			printf("%d ",i+1);
		}
	}
	return 0;
}

 若有不同思路,欢迎评论区留言,看到必回,Goodnight!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码no摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值