CodeM Qualifying Match Q1
问题描述:
具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 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
1 import java.util.Scanner; 2 3 public class Q1 4 { 5 public static void main(String[] args) 6 { 7 Scanner sc = new Scanner(System.in); 8 int a_length = sc.nextInt(); 9 int a[] = new int[a_length]; 10 for(int i=0;i<a_length;i++) 11 { 12 a[i]=sc.nextInt(); //仍可以实现空格读取 13 } 14 int b_length = sc.nextInt(); 15 int b[] = new int[b_length]; 16 for(int u=0;u<b_length;u++) 17 { 18 b[u] = sc.nextInt(); 19 } 20 int n=0; 21 int difference=0; 22 while(n<=(b_length-a_length)) 23 { 24 int temp=0; 25 for(int k=0;k<(a_length);k++) 26 { 27 temp += Math.pow(a[k]-b[k+n],2); //math.pow(基底,幂) 28 } 29 if(n==0 || difference>temp) 30 { 31 difference=temp; 32 } 33 n++; 34 } 35 System.out.println(difference); 36 for(int p=0;p<b_length;p++) 37 { 38 System.out.print(b[p]); 39 } 40 41 } 42 }