** ** 一开始看到这题觉得贼容易,一顿操作猛如虎,一看分数55。看了其他人的分析才发现自己题目意思都没看懂,还把题目复杂化了,这题其实直接用几个for循环加数组就能解决了。最坑爹的是这个样例,你会发现不管你怎么做,随便写几行代码,输入这个样例得到的结果很大的可能是对的。样例太简单了,而且具有特殊性,每行和每列的数字是一样的,看不出区别,但是测试的时候输入几个大点的数据程序就GG了。
这题更多的是考查数学思维,和代码相关的知识点也就一个二维数组了。
废话不多说,看下这个题的几个关键点:
- 好的芯片数量比坏的芯片多
- 第i行第j列的数据表示用第i块芯片测试第j块芯片的测试结果
- 芯片不能自己测试自己
前两个关键点都很容易忽视掉,我就是忽视了第二个关键点,死活得不到满分。
从第二个关键点就可以看出来,每一列的数据都是第j块的测试结果;而通过第一个关键点可以知道好的芯片数量是更多的,而且好芯片可以正确的测出一个芯片的好坏,所以我们只要判断这一列中1的数量是否所有芯片的一半更多,就可以得出这个被测的芯片的好坏了。我一开始忽略了第二个关键点,所以是横着测的,大家记得避开这个坑。
package _3_5_test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.NavigableMap;
import java.util.Scanner;
import java.util.TreeSet;
import javax.swing.event.TreeSelectionEvent;
/*芯片测试
* 1、最终的结果数要比总数的一半多
* 2、当某个芯片被所有芯片测试一遍,好的结果更多的话,这个芯片就是好的
*
*
* */
public class FiftyFour {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int num[][] = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
num[i][j] = scanner.nextInt();
}
}
for (int i = 0; i < n; i++) {
int good = 0;
for (int j = 0; j < n; j++) {
if (num[j][i]==1) {
good++;
}
}
if (good >n/2) {
System.out.print(i+1+" ");
}
}
}
}