音乐研究

链接: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 @   莴苣&  阅读(188)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示