链接:https://ac.nowcoder.com/acm/problem/13222
来源:牛客网
题目描述
具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小。两段等长音频的difference 定义为:
difference = SUM(a[i] - b[i])(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
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n,m,a[1001],b[1001];
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
}
long long ans=10000000000;
for(int i=1;i<=m-n+1;i++){
long long sum=0;
for(int j=1;j<=n;j++){
sum=sum+pow((a[j]-b[i+j-1]),2);
}
ans=min(sum,ans);
}
cout<<ans<<endl;
return 0;
}
遇到问题:一开始没理解题意,以为different是不同的个数,所以一直AC不了,也没注意题目隐藏的条件,是与a调大小相等的串的different。
解决方法:different是(a[i]-b[i])^2算出来的,又是要找与a相等的串,那么每次的内层循环就只需要循环size(a)次,而外层循环则只需要到m-n+1处就行(第二个串里面,等于第一个串里的size大小的最后一组串就是m-n+1),所以外层循环只需要m-n+1次。
感悟:以前做枚举的时候,感觉很简单,并且很瞧不起这个方法,我明白这是我没写过稍微难点的题目,现在我又开始刷枚举题目,打算先把枚举题目刷够了,在去刷别的题目,个人认为枚举题目是让人真正的把想法完全变成实践的最快的方法,先枚举,在算法。冲冲冲