首页 > 编程语言 > 详细

蓝桥杯审美课 java

时间:2019-10-07 12:39:47      阅读:84      评论:0      收藏:0      [点我收藏+]
问题描述
  《审美的历程》课上有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。
 
 
方法一:一个一个,一行一行的比。这样至少能得分,但是绝对会运行超时。w(?Д?)w
方法二:参照了许多博客后,才算是看懂了大佬的想法。(1.https://blog.csdn.net/kunzhoumei/article/details/87459450 2.https://blog.csdn.net/qq_42835910/article/details/87207904
遗憾的是,第一位博主的代码运行到70分的时候超时了,看了楼下的评论之后发现将输入流换成BufferedReader之后神奇的100分过了。φ(゜▽゜*)?
下面是代码
package lanqiao.improve;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Aesthetic {



    public static void judge(int[][] array,int kid,int picture){
        int count = 0;
        int inf = (1<<picture) -1;//把picture转换为十进制,然后转换为全为1的形式。例如3 则inf=7,为111
        int[] ten = new int[inf + 1];//判断的是十进制数的有无,所以直接把数组给扩了
        for(int i = 0;i<kid;i++){
            int sum = 0;
            for(int j = 0;j<picture;j++){
                sum = (sum<<1)+array[i][j];
            }
            ten[sum]++;//证明十进制为sum值的数存在,因此加一
        }

        for(int i = 0;i<ten.length;i++){
            if(ten[i]!=0){//存十进制值的时候,可能在十进制范围内不存在
                int y = i^inf;//进入判断可以知道i这个十进制值存在。同时int为全1的数,与之异或可以得到完全相反的数
                count+=ten[i]*ten[y];//如果这个数存在,那么在i的时候有一次,在y的时候又有一次。如果不存在则直接为0
            }
        }

        System.out.println(count/2);

    }

    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       String str = br.readLine();
       String[] strs = str.split(" ");
       int kid = Integer.parseInt(strs[0]);//输入流里这个kid和picture我处理的太烂了...,,???,,
       int picture = Integer.parseInt(strs[1]);
       int[][] array = new int[kid][picture];
       for(int i=0;i<kid;i++){
           String[] temp = br.readLine().split(" ");
           for(int j = 0;j<picture;j++){
               array[i][j] = Integer.parseInt(temp[j]);
           }
       }
       /*for (int i = 0;i<kid;i++){
           for(int j = 0;j<picture;j++){
               System.out.print(array[i][j]+" ");
           }
           System.out.println();
       }*/
       judge(array, kid, picture);
    }
}

  

 
 
 

蓝桥杯审美课 java

原文:https://www.cnblogs.com/mushuise/p/11629865.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!