審美賽_(java)實現


 

問題描述

  《審美的歷程》課上有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。
 
思路:如果暴力求解的話,三層for循環肯定超時,這道題可以考慮把每個同學的答案看為一個二進制的數字,我們把他轉為一個十進制的數字存在一個數組里面,並且根據,相反答案的關系求出有多少對,
比如01 和10 是一對相反答案,並且我們發現01=1,10=2,並且1+2=2^2-1,同理對於110和001,我們發現110=6,001=1,並且6+1=2 3-1,以此類推,我們可以通過此關系求出所要的答案,時間復雜度可以縮短為o(n 2)
 1 import java.util.Scanner;
 2 public class Main {
 3  public static int [][]array=new int [50001][21];
 4   public static void main(String[] args) {
 5     Scanner scanner=new Scanner(System.in);
 6     int n=scanner.nextInt();
 7     int m=scanner.nextInt();
 8     int array1[]=new int[50001];
 9     for (int i = 0; i <n; i++) {
10         array1[i]=0;
11         for(int j=0;j<m;j++)
12         {
13             array[i][j]=scanner.nextInt();
14         }
15         for(int j=0;j<m;j++)
16           {
17           array1[i]+=array[i][j]*Math.pow(2, j);    
18           }
19     }
20     int a1=(int) Math.pow(2, m)-1;
21     int sum=0;
22    for(int i=0;i<n-1;i++)
23    {
24        for(int j=i+1;j<n;j++)
25        {
26            if(array1[i]==(a1-array1[j])) {
27                sum++;
28            }
29        }
30    }
31     System.out.println(sum);
32 }
33  
34 }

其實這個代碼的復雜度已經很低了,但是在藍橋杯官網上運行時發現超時,只能得到70分,但是寫成c++卻可以得到滿分,這可能因為c++比java速度快的原因吧,希望能看到你們的更好的答案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM