问题描述
《审美的历程》课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手。老师请同学们分辨哪些画的作者是梵高,但是老师自己并没有答案,因为这些画看上去都像是小朋友画的……老师只想知道,有多少对同学给出的答案完全相反,这样他就可以用这个数据去揭穿披着皇帝新衣的抽象艺术了(支持帅老师^_^)。
答案完全相反是指对每一幅画的判断都相反。
输入格式
第一行两个数n和m,表示学生数和图画数;
接下来是一个n*m的01矩阵A:
如果aij=0,表示学生i觉得第j幅画是小朋友画的;
如果aij=1,表示学生i觉得第j幅画是梵高画的。
输出格式
输出一个数ans:表示有多少对同学的答案完全相反。
分析:
首先想到的是 暴力遍历 依次对比相应位数上的值是否相同 一旦有相同就break 进入下一个同学的判断进行比较
采用的是使用nextint来获取数据,据说在数据很大时会出现超时的情况 需要使用字符流
/**
* Copyright (C), 2015-2019
* FileName: AestheticsCopy
* Author: zun
* Date: 2019/2/23 11:58
* Description: 审美课 网上参考
* History:
* <author> <time> <version> <desc>
* pengzijun 2019/2/23 11:58 1.0 审美课 网上参考
*/
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
/**
* 〈一句话功能简述〉
* 〈审美课 网上参考〉
*
* @author zun
* @create 2019/2/23
* @since 1.0.0
*/
import java.util.Map.Entry;
public class AestheticsCopy {
private static Reader reader;
public static void main(String[] args) {
reader = new InputStreamReader(System.in);
int n, m;
n = getInt();
m = getInt();
HashMap<Integer, Integer> hm = new HashMap<>(n);
for (int i = 0; i < n; ++i) {
int num = 0, x = 0;
for (int j = 0; j < m; j++) {
x = getInt();
num = (num << 1) + x;
}
hm.put(num, hm.containsKey(num) ? hm.get(num) + 1 : 1);
}
int sum = 0, maxn = (1 << m) - 1;
for (Entry<Integer, Integer> entry : hm.entrySet()) {
if (maxn / 2 < entry.getKey())
continue;
int key = entry.getKey() ^ maxn;
if (hm.containsKey(key))
sum += hm.get(key) * entry.getValue();
//这部分就看不太懂了
}
System.out.println(sum);
}
public static int getInt() {
int res = 0, read;
try {
while ((read = reader.read()) != -1) {
if (java.lang.Character.isDigit(read)) {// 因为全是非负数,不需要判断负号‘-’,只要是数字就行
res = read - '0';
while ((read = reader.read()) != -1) {// 继续得到能得到的数字
if (java.lang.Character.isDigit(read)) {
res = res * 10 + (read - '0');
} else {
break;
}
}
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
}