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

    输入

     
     

    输出

     
    思路:按照上面的提示可以得到,difference = SUM(a[i] - b[i])2 (1 ≤ i ≤ n),我们可以利用双重遍历,将二中的音高移动求和并于min作比较,由此可以得到difference的最小值。
     1 #include<stdio.h>
     2 #include<math.h>
     3 #include<stdlib.h>
     4 int main()
     5 {
     6     int i,j,m,n,min,max,*a,*b;
     7     a=(int*)malloc(1000*sizeof(int));
     8     b=(int*)malloc(1000*sizeof(int));
     9     scanf("%d",&m);
    10     for(i=0;i<m;i++){
    11         scanf("%d",&a[i]);
    12     }
    13     scanf("%d",&n);
    14     for(i=0;i<n;i++){
    15         scanf("%d",&b[i]);
    16     }
    17     for(i=0,min=0;i<m;i++){
    18         min+=pow(a[i]-b[i],2);
    19     }
    20     for(i=1;i<n-m;i++){
    21         for(j=i,max=0;j<m+i;j++){
    22             max+=pow(a[j-i]-b[j],2);
    23         }
    24         if(min>max){
    25             min=max;
    26         }
    27     }
    28     printf("%d",min);
    29     return 0;
    30 }
     
  • 相关阅读:
    python中的函数编程
    Python中的类型关系和继承关系
    MySQLdb for Python使用指南
    调试模式
    js window.open打开新页面
    JVM调优
    jacoco(spring boot启动) agent tcpserver使用方案
    C#多线程之ManualResetEvent和AutoResetEvent
    下载verycd的方法下载电驴资源隐藏资源的最新可用方法
    C# 多线程之信号量Semaphore
  • 原文地址:https://www.cnblogs.com/woju/p/12891547.html
Copyright © 2011-2022 走看看