1. 程式人生 > >CodeM資格賽1

CodeM資格賽1

pac col cto 先生 temp 研究 進行 現在 code

題目描述

美團外賣的品牌代言人袋鼠先生最近正在進行音樂研究。他有兩段音頻,每段音頻是一個表示音高的序列。現在袋鼠先生想要在第二段音頻中找出與第一段音頻最相近的部分。

具體地說,就是在第二段音頻中找到一個長度和第一段音頻相等且是連續的子序列,使得它們的 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


ac代碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int main() { int n, m; int first[1005],second[1005]; int temp; cin >> n; for (int i = 0;i < n;i++) { cin >> first[i]; } cin >> m; for (int i = 0;i < m;i++) { cin >> second[i]; } int ans = -1; for (int pos = 0;pos < m-n+1;pos++) {
int sum = 0; for (int j = 0;j < n;j++) { sum += (first[j] - second[j + pos])*(first[j] - second[j + pos]); } if (ans==-1||sum < ans) ans = sum; } cout << ans << endl; //cout << "hello" << endl; return 0; }

CodeM資格賽1