蓝桥杯:芯片测试

306 阅读2分钟

** \color{#ff7d00}{解析:} ** 一开始看到这题觉得贼容易,一顿操作猛如虎,一看分数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+" ");
			}
		}


	}

}