音乐研究

链接:https://ac.nowcoder.com/acm/problem/13222
来源:牛客网

题目描述

美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究。他有两段音频,每段音频是一个表示音高的序列。现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分。

具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 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的最小值
示例1

输入

 
 

输出

 
思路:按照上面的提示可以得到,difference = SUM(a[i] - b[i])2 (1 ≤ i ≤ n),我们可以利用双重遍历,将二中的音高移动求和并于min作比较,由此可以得到difference的最小值。
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4 int main()
 5 {
 6     int i,j,m,n,min,max,*a,*b;
 7     a=(int*)malloc(1000*sizeof(int));
 8     b=(int*)malloc(1000*sizeof(int));
 9     scanf("%d",&m);
10     for(i=0;i<m;i++){
11         scanf("%d",&a[i]);
12     }
13     scanf("%d",&n);
14     for(i=0;i<n;i++){
15         scanf("%d",&b[i]);
16     }
17     for(i=0,min=0;i<m;i++){
18         min+=pow(a[i]-b[i],2);
19     }
20     for(i=1;i<n-m;i++){
21         for(j=i,max=0;j<m+i;j++){
22             max+=pow(a[j-i]-b[j],2);
23         }
24         if(min>max){
25             min=max;
26         }
27     }
28     printf("%d",min);
29     return 0;
30 }

 

 
posted @ 2020-05-14 21:37  莴苣&  阅读(182)  评论(0编辑  收藏  举报