题意
美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究。他有两段音频,每段音频是一个表示音高的序列。现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分。
具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小。两段等长音频的 difference 定义为:
difference = SUM(a[i] - b[i])^2 (1 ≤ i ≤ n),其中SUM()表示求和
其中 n 表示序列长度,a[i], b[i]分别表示两段音频的音高。现在袋鼠先生想要知道,difference的最小值是多少?数据保证第一段音频的长度小于等于第二段音频的长度。
思路
在b序列中枚举起始位置暴力计算,最后取最小结果即可
代码
#include <cstdio>
int a[1001],b[1001];
int main()
{
int n,m,ans,temp;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
ans=0x7fffffff;
for(int i=0;i<m-n+1;i++)
{
temp=0;
for(int j=0;j<n;j++)
temp+=(a[j]-b[i+j])*(a[j]-b[i+j]);
if(temp<ans)
ans=temp;
}
printf("%d\n",ans);
return 0;
}