算法训练 审美 (Java)

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

《审美的历程》课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手。老师请同学们分辨哪些画的作者是梵高,但是老师自己并没有答案,因为这些画看上去都像是小朋友画的……老师只想知道,有多少对同学给出的答案完全相反,这样他就可以用这个数据去揭穿披着皇帝新衣的抽象艺术了(支持帅老师_)。
  答案完全相反是指对每一幅画的判断都相反。

输入格式

第一行两个数n和m,表示学生数和图画数;
  接下来是一个n*m的01矩阵A:
  如果aij=0,表示学生i觉得第j幅画是小朋友画的;
  如果aij=1,表示学生i觉得第j幅画是梵高画的。

输出格式

输出一个数ans:表示有多少对同学的答案完全相反。

样例输入

3 2
1 0
0 1
1 0

样例输出

2

样例说明

同学1和同学2的答案完全相反;
  同学2和同学3的答案完全相反;
  所以答案是2。

数据规模和约定

对于50%的数据:n<=1000;
  对于80%的数据:n<=10000;
  对于100%的数据:n<=50000,m<=20。

将每个人的判断看出是二进制的字符串,然后使用HashMap进行存储,完全相反的判断即是对这个二进制字符串进行取反

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		Reader.init(System.in);
		int n = Reader.nextInt();
		// 这里不要用到m这个数据,所以不保存
		Reader.nextInt();
		// 创建一个大小为10000的map用来存储每个人的判断
		Map<String, Node> map = new HashMap<String, Node>(10000);
		for (int i = 0; i < n; i++) {
			String s = Reader.nextLine();
			s = s.replaceAll(" ", "");
			// 把判断完全相同的人划分到一起
			if (!map.containsKey(s)) {
				Node node = new Node();
				map.put(s, node);
			} else {
				Node node = map.get(s);
				node.num++;
			}
		}
		
		int sum = 0;
		
		for (String key : map.keySet()) {
			// 对每个字符取反,即完全不相同的判断结果
			char[] chs = key.toCharArray();
			for (int i = 0; i < chs.length; i++) {
				chs[i] = chs[i] == '1' ? '0' : '1';
			}
			String _key = new String(chs);
			Node node = map.get(_key);
			// 判断是否有完全不相同的判断,有则计算有几对人
			if (node != null) {
				sum += map.get(key).num * node.num;
			}
		}
		// 上面计算了2次,所以需要除以2
		System.out.println(sum/2);

	}
}

class Node {
	int num = 1;
}

// 下面不是逻辑代码,只是输入模板,加入读取数据的速度
class Reader {
	static BufferedReader reader;
	static StringTokenizer tokenizer;

	// ** call this method to initialize reader for InputStream *//*
	static void init(InputStream input) {
		reader = new BufferedReader(new InputStreamReader(input));
		tokenizer = new StringTokenizer("");
	}

	// ** get next word *//*
	static String next() throws IOException {
		while (!tokenizer.hasMoreTokens()) {
			tokenizer = new StringTokenizer(reader.readLine());
		}
		return tokenizer.nextToken();
	}

	static String nextLine() throws IOException {
		return reader.readLine();
	}

	static int nextInt() throws IOException {
		return Integer.parseInt(next());
	}

	static long nextLong() throws IOException {
		return Long.parseLong(next());
	}

	static char nextChar() throws IOException {
		return next().toCharArray()[0];
	}

	static float nextFloat() throws IOException {
		return Float.parseFloat(next());
	}

	static Double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}
}

发布了27 篇原创文章 · 获赞 2 · 访问量 1459

猜你喜欢

转载自blog.csdn.net/Samil_Hy/article/details/104723974