c语言测试芯片好坏


问题描述
有n个(2<n<20)芯片,好的或坏的,并且有比坏的芯片更多的已知的好的芯片。
每个芯片都可以用来测试其他芯片。当用一个好的芯片测试其他芯片时,它可以正确地给出被测芯片是好是坏。当用坏芯片测试其他芯片时,会随机给出好的或坏的测试结果(也就是说,这个结果与被测芯片的实际质量无关)。
给出所有芯片的测试结果,并询问哪些芯片是好的芯片。
输入格式
输入数据的第一个动作是一个整数n,它表示芯片的数量。
n+1的第二行是行为n*n表,每行有n个数据。表中的女生化妆每个数据都是0或1。第i行第j列(1<i,j<n)中的数据表示用i块芯片测试j块芯片时得到的测试结果。1代表好,0代表坏,i=j总是1(不代表芯片本身的测试结果)。芯片不能自我测试。
输出格式
按从小到大的顺序输出所有好芯片的数量。
样本输入

一百零一
010
一百零一
样本输出
十三
C语言参考答案:
包括:
#定义最大值20

In main()
{
int n,text[20][20],i,j,s;//s是坏芯片的数量
scanf(“%d”,&n);

如果(n>=2&&n<=20)
{
对于(i=0;i<n;i++)
{
对于(j=0;j<n;j++)
{
scanf(“%d”,&text[i][j]);
}
}
//清除坏芯片,留下好芯片
对于(j=0;j<n;j++)
{
S=0;
对于(i=0;i<n;i++)
{
S+=文本[I][J];
}
如果(S>N/2)
printf(“%d”,j+1);

}
}
返回0;
}

摘录:
以下两个结论是有用的。首先列出它们。

如果你随机抽取两片芯片进行测试,会有
1)如果结果为真,则两者均为真或假。
2)对于其他结果,至少有一个是错误的。

在任何偶数芯片中,如果好的芯片比坏的芯片多,那么所有的芯片都分为两组。根据抽屉原理,有
1)一组必须有两个好的芯片。
2)好芯片的数量必须大于坏芯片的数量。

测试流程
1)将芯片分为1和2、3和4组。2K-1和2K。如果我们互相测试,我们必须得到与真实组相同的结果。
2)保留与真实组相同的结果并丢弃其他组。好芯片组肯定比坏芯片组多。(因此,当只有两个或更多组为真时,它们必须为真,测试结束)
3)如果结果是真的,芯片将是好的或坏的,因此一半可以丢弃。从所有同一个真实组中,任意取出一个,丢弃另一个,组成一个新的测试组,继续两组或两组,直到同一真实组只有两个或一个测试,坚持到最后才是好的芯片。

解释:同一个真实的群体可能会变得奇怪。当为奇数数组时,选择任意一组(假定为A)和剩余一组进行测试A,如果测试结果A大于或等于芯片的一半,则A更好,测试结束。否则,A是一个坏芯片。如果A是一个好芯片,它一定是一个坏芯片。拆下其余零件后,将形成一个新的测试组,并将继续进行两个或两个组。

总的原则类似于淘金热。一开始有很多好的筹码。当我们取出芯片时,我们必须确保坏芯片的数量必须大于或等于好芯片的数量。这样,我们就可以确保剩余芯片中好芯片的数量大于坏芯片的数量。当组数为奇数时,超过一半的投票有效(同样有效,因为好大于坏,所以相等必须是好的)。

因为一次至少移除一半的芯片,最坏的情况是每次只移除一半的芯片,并以相等的比率减少。当有n个芯片时,测试次数为n+(n/2)+(n/4)…=2n。
特赦

转载于:https://www.cnblogs.com/blogst/p/10942521.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值