您的位置:首页 > 编程语言 > C语言/C++

芯片测试(蓝桥基础练习)详解

2017-07-19 15:14 246 查看
问题描述

  有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

在阅读这道题目的时候,题目能读懂,但是没能一下就想出答案

(膜拜大神),想了片刻后,看出了题目给定的矩阵是对称矩阵,于是就想着,是否在判断这个题目对称位置都为1的时候就表明这个芯片是好的呢,于是就开始写了程序,代码如下:

#include <iostream>

#include <algorithm>

using namespace std;

int main ()

{
int n,count=0;
cin>>n;
int *p=new int [n*n];
int *good=new int
;
for(int i=0;i<n*n;i++)
cin>>*(p+i);
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++){
if(i!=j){
if(*(p+i*n+j)==1 && *(p+i*n+j)==*(p+j*n+i)){
*(good+count++)=i+1;
*(good+count++)=j+1;
}
}
}
sort(good,good+count);
cout<<*(good);
for(int i=1;i<count;i++){
if(*(good+i)!=*(good+i-1)){
cout<<" "<<*(good+i);
}
}
cout<<endl;

return 0;

 } 

提交上去后,60分,程序运行错误,啊,5个样例过了3个,看来自己还是太菜了

哎,不对,怎么提示运行错误呀?这是在逗我吗

咦,看了很久,原来是我定义的good数组越界了,好吧,那我改大一点吧,再次提交,还是60分,尴尬

--------------------------------------------------- 胡扯分割线

额,好吧,看来我还得重新整理下思路了,尴尬了,心情还是不美丽

然后我又看起了数组,对比答案,是不是有什么规律咋的(广告:自我感觉对数字挺敏感的)

哇喔,还真有规律,原来答案就在矩阵的最后一行呀-----最后一行的数值是1的,说明这是好的芯片,好吧,先提交试下深浅

--------------------------------完美100分

代码如下:

#include <iostream>   

using namespace std;    

int main()  

{  

    int n;   
cin>>n;
int *p=new int [n*n];
for(int i=0;i<n*n;i++)
cin>>*(p+i);
for(int j=0;j<n-1;j++){
if(*(p+(n-1)*n+j)) cout<<j+1<<" ";
}
cout<<n;

    return 0;  

}  

---------------------------------------------------正经起来

不对,这肯定不是这道题目想要考察的,不管是理解能力方面还是知识点方面,都不在这道题目的考察范围吧,我猜想(哈哈哈,先自恋一下,这道题可能是因为出题不够严谨,出bug了,摊手状)

然后我又去找了下网上前辈大神们的答案,哟西,还真是不一样的嘛!!!

是应该好好的理解下题目了,好的芯片测试别的芯片就是正确的结果,坏的就是随机的结果,,然后,题目中又说,第i,j位置的含义为i芯片测试j芯片的结果,那么,第j列就是其他芯片测试j的结果,题目中说好的好芯片的数量大于坏芯片的数量,那么我们就统计j列的数字1多点还是0多点,就可以判断芯片的好坏了(哎呀,终于写完了,累个半死,还不快快点赞分享)

代码如下:

#include <iostream>

#include <algorithm>

using namespace std;

int main ()

{
int n,count=0;
cin>>n;
int *p=new int [n*n];
for(int i=0;i<n*n;i++)
cin>>*(p+i);
/*for(int j=0;j<n-1;j++){
if(*(p+(n-1)*n+j)) cout<<j+1<<" ";
}
cout<<n;*/
bool f=false;
for(int i=0;i<n;i++){
count=0;
for(int j=0;j<n;j++){
if(i!=j) count+=*(p+j*n+i);
}
if(count>=n/2 && !f){
cout<<i+1;
f=true;

else if(count>=n/2) cout<<" "<<i+1;
}
cout<<endl;

return 0;

 } 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 测试 芯片