1. 程式人生 > >審美賽_(java)實現

審美賽_(java)實現

bsp 同學 system 十進制 1=1 暴力求解 說明 exti 格式

前記:考慮到再過一個月就是藍橋杯比賽了,而我報的是java組,所以最近寫算法就用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=22-1,同理對於110和001,我們發現110=6,001=1,並且6+1=23-1,以此類推,我們可以通過此關系求出所要的答案,時間復雜度可以縮短為哦n2
 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速度快的原因吧,希望能看到你們的更好的答案。

審美賽_(java)實現