CodeM資格賽

[編程題] 音樂研究

時間限制:1秒

空間限制:32768K

美團外賣的品牌代言人袋鼠先生最近正在進行音樂研究。他有兩段音頻,每段音頻是一個表示音高的序列。現在袋鼠先生想要在第二段音頻中找出與第一段音頻最相近的部分。

具體地說,就是在第二段音頻中找到一個長度和第一段音頻相等且是連續的子序列,使得它們的 difference 最小。兩段等長音頻的 difference 定義爲:
difference = SUM(a[i] - b[i])2 (1 ≤ i ≤ n),其中SUM()表示求和 
其中 n 表示序列長度,a[i], b[i]分別表示兩段音頻的音高。現在袋鼠先生想要知道,difference的最小值是多少?數據保證第一段音頻的長度小於等於第二段音頻的長度。

輸入描述:
第一行一個整數n(1 ≤ n ≤ 1000),表示第一段音頻的長度。
第二行n個整數表示第一段音頻的音高(0 ≤ 音高 ≤ 1000)。
第三行一個整數m(1 ≤ n ≤ m ≤ 1000),表示第二段音頻的長度。
第四行m個整數表示第二段音頻的音高(0 ≤ 音高 ≤ 1000)。


輸出描述:
輸出difference的最小值

輸入例子:
2
1 2
4
3 1 2 4

輸出例子:
0



[java] view plain copy

1.   import java.util.Scanner;  

2.     

3.   public class Main{  

4.     

5.       public static void main(String[] args) {  

6.          Scanner sc = new Scanner(System.in);  

7.          while(sc.hasNext()){  

8.              int[] a1 = new int[1000];  

9.              int[] a2 = new int[1000];  

10.            int n= sc.nextInt();  

11.            for(int i=0;i<n;i++){  

12.                a1[i] = sc.nextInt();  

13.            }  

14.            int m = sc.nextInt();  

15.            for(int i=0;i< m;i++){  

16.                a2[i] = sc.nextInt();  

17.            }  

18.            int ans = Integer.MAX_VALUE;  

19.            for(int i=0;i<=m-n;i++){   //暴力搜索法,從第二個序列第一個元素開始依次尋找最小匹配序列  

20.                int sum = 0;  

21.                for(int j=0;j<n;j++){  

22.                    sum += (a1[j]-a2[i+j]) * (a1[j]-a2[i+j]);  

23.                }  

24.                ans = Math.min(ans, sum);  

25.            }  

26.            System.out.println(ans);  

27.        }  

28.        sc.close();  

29.     }  

30. }  




[編程題] 錦標賽

時間限制:1秒

空間限制:32768K

組委會正在爲美團點評CodeM大賽的決賽設計新賽制。

比賽有 n 個人參加(其中 n 爲2的冪),每個參賽者根據資格賽和預賽、複賽的成績,會有不同的積分。比賽採取錦標賽賽制,分輪次進行,設某一輪有 m 個人參加,那麼參賽者會被分爲 m/2 組,每組恰好 2 人,m/2 組的人分別廝殺。我們假定積分高的人肯定獲勝,若積分一樣,則隨機產生獲勝者。獲勝者獲得參加下一輪的資格,輸的人被淘汰。重複這個過程,直至決出冠軍。

現在請問,參賽者小美最多可以活到第幾輪(初始爲第0輪)? 
輸入描述:
第一行一個整數 n (1≤n≤ 2^20),表示參加比賽的總人數。

接下來 n 個數字(數字範圍:-1000000…1000000),表示每個參賽者的積分。

小美是第一個參賽者。


輸出描述:
小美最多參賽的輪次。

輸入例子:
4
4 1 2 3

輸出例子:
2



題解:理想情況是,與小美比賽的所有選手積分都不大於小美,而且積分相等時假設小美獲勝,因此,小美能夠參加的所有輪次是(int)(Math.log(count*1.0)/Math.log(2.0))。count爲積分不大於小美的人數。

[java] view plain copy

1.   import java.util.Scanner;  

2.     

3.   public class Main {  

4.     

5.       public static void main(String[] args) {  

6.           Scanner sc = new Scanner(System.in);  

7.           while (sc.hasNext()) {  

8.               int n = sc.nextInt();  

9.               int lowToXIAOMEI = 0;  

10.             int x = 0;  

11.             for (int i = 0; i < n; i++) {  

12.                 int temp = sc.nextInt();  

13.                 if (i == 0)  

14.                     x = temp;   //第一個爲小美的積分  

15.                 if (temp <= x) {  

16.                     lowToXIAOMEI++;  //積分不大於小美,人數加1.  

17.                 }  

18.             }  

19.             System.out.println((int) (Math.log(lowToXIAOMEI * 1.0) / Math.log(2.0)));  

20.         }  

21.         sc.close();  

22.     }  

23.   

24. }  




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章