CodeM资格赛1

Posted 炮二平五

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeM资格赛1相关的知识,希望对你有一定的参考价值。

题目描述

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

具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 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的主要内容,如果未能解决你的问题,请参考以下文章

CodeM美团点评编程竞赛资格赛题

CodeM资格赛1

美团CodeM资格赛第二题

「美团 CodeM 资格赛」试题泛做

#6085. 「美团 CodeM 资格赛」优惠券

CodeM资格赛2