zoukankan      html  css  js  c++  java
  • 牛客网音乐研究(枚举)

    链接: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

    输入

    复制
    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次。

    感悟:以前做枚举的时候,感觉很简单,并且很瞧不起这个方法,我明白这是我没写过稍微难点的题目,现在我又开始刷枚举题目,打算先把枚举题目刷够了,在去刷别的题目,个人认为枚举题目是让人真正的把想法完全变成实践的最快的方法,先枚举,在算法。冲冲冲

  • 相关阅读:
    一般 武胜
    Export/Import CSV files with MySQL 武胜
    关于Python中的for循环控制语句
    Linux下libxml2的使用
    Foxit PDF Reader能有效升级日文包
    Dependency introduction
    eclipse 插件更新站点
    TypeError: 'module' object is not callable 原因分析
    ubuntu11.10 安装reportlab出现“Python.h: 没有那个文件或目录”
    Windows 7 下如何调整网卡的优先级
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/11587168.html
Copyright © 2011-2022 走看看