算法基础 蓝桥杯 审美课 JAVA
程序员文章站
2022-06-26 11:31:13
...
我自己算只得了50分,暴力解法
然后去搜了一下答案
这道题要用到 << >> 还要IO流输入
<<(向左位移) 针对二进制,转换成二进制后向左移动,后面用0补齐
>>(向右位移) 针对二进制,转换成二进制后向右移动
^按位取反
这个是一个大佬的代码,我给复制过来了,不过找不到那个链接了
代码的大概意思是
将学生的答案按2进制来看,max作用是将答案全部取反
两个for循环是遍历所有学生的答案,并且将答案一样的学生的数量记录下来,记到shi[]数组里
后面两个for循环是经答案先取反,取反后找是否有这样的学生,如果有则用这个答案的学生数量相乘,如果没有shi[]是0,则不计数
答案要除2,结束
import java.io.*;
public class Main3 {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static void main(String[] args) throws IOException {
int n = nextInt();
int m = nextInt();
int count = 0;
int answer[][] = new int[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
answer[i][j] = nextInt();
int max = (1 << m) - 1;
int shi[] = new int[max + 1];
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < m; j++) {
sum = (sum<<1) + answer[i][j];
}
shi[sum]++;
}
for (int x = 0; x < shi.length; x++) {
if (shi[x] != 0) {
int y = x ^ max;
count += shi[y] * shi[x];
}
}
System.out.print(count / 2);
}
private static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
}
上一篇: 【链表】两个有序链表的合并
下一篇: Hive中文注释乱码问题解决