欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法基础 蓝桥杯 审美课 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;
    }
}