美的クラス
リソース制限
制限時間:1.0秒
メモリ制限:256.0MB
問題の説明
「美の旅」のクラスにはn人の生徒がいました。シュアイ先生はm枚の絵を見せましたが、その中にはゴッホの作品もあれば、5歳の子供たちが描いたものもありました。先生はゴッホが書いた絵を区別するように生徒に求めましたが、これらの絵は子供が描いたように見えるため、先生自身は答えを持っていませんでした...先生は生徒に与えられた答えの数を知りたいだけです彼はこのデータを使用して、皇帝の新しい服の抽象画を公開することができます(サポート教師のシュアイ)。
答えは完全に反対です。つまり、各絵の判断は反対です。
入力フォーマット:
最初の行の2つの数字nとmは、生徒の数と写真の数を表します。
次はn * m 01の行列A
です。aij= 0の場合、生徒はj番目の絵が子供が描いたもの
。aij= 1の場合、j番目の絵はヴァンゴッホによるものだと生徒が思っていることを意味します。
出力フォーマット
数ansを出力します。完全に反対の答えを持っている生徒のペアの数を示します。
サンプル入力
3 2
1 0
0 1
1 0
サンプル出力
2
サンプル概要
クラスメート1とクラスメート2の答えは完全に反対です。
クラスメート2とクラスメート3
の答えは完全に反対です。したがって、答えは2です。
思考分析
①まず、各生徒の01の答えを対応するバイナリの整数に変換し、生徒の配列stu []に格納します(添え字は生徒の順序に対応し、値は生徒からの回答です)
。②変換された整数をanswer回答配列ans []を入力します(配列の添え字は回答であり、値は回答に対応する生徒の数です)。
③その後、生徒配列stu []をトラバースし、各生徒と完全に反対の答えをans []回答配列の添え字として取り、それに対応する値(つまり、反対の答えを持つ生徒の数)を累積します。 ④最後に
、結果を2で除算して出力します(たとえば、AとBが反対で、Aを処理するときに1回、Aを処理するときにもう一度累積するなど、互いに反対の2つの答えが1回累積されるため、2で除算します。 Bを処理しているので、半分に折りたたむ必要があります、emmmm)
コード
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]), // 学生数
m = Integer.parseInt(s[1]);// 图画数
int[] stu = new int[n]; // 每个学生的答案
int[] ans = new int[1 << m]; // 每个答案的对应的学生数
for (int i = 0; i < n; i++) {
s = br.readLine().split(" ");
for (int j = 0; j < m; j++) {
stu[i] = (stu[i] << 1) + Integer.parseInt(s[j]);// 将字符串转换为二进制对应的整数
}
ans[stu[i]]++;
}
int num = (1 << m) - 1, // 范围内最大全1二进制数
result = 0;
for (int i = 0; i < n; i++) {
result += ans[num ^ stu[i]];// num^stu[i]即为相反的答案
}
System.out.println(result / 2);// 去掉重复答案
}
}