美团点评编程大赛题目疑问

题目描述

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

具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 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

以下是我写的代码,在VS2017运行正常,提交之后说我没有通过所有案例,我尝试了很多输入,感觉一切正常啊,是不是我写代码的风格太不符合要求了?

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<math.h>
#define MAX 1000
int Calcu(int First[MAX], int For[MAX],int, int);//声明函数计算两个数组的SUM
int main()
{
int value[MAX];
int FirstLen=0, SecondLen=0;
    int First[MAX], Second[MAX];
scanf("%d", &FirstLen);
for (int i = 0; i < FirstLen; i++)
{
scanf("%d", &First[i]);
}
    scanf("%d", &SecondLen);
for (int i = 0; i < SecondLen; i++)
{
scanf("%d", &Second[i]);
}
int For[MAX];//定义暂时存放数据的数组
for (int i = 0; i < SecondLen-FirstLen+1; i++)
{
int ii = 0;//每次循环都定义ii的值为0
for (int j = i; j < i+FirstLen; j++)//从第i个位置起,把后面的固定长度的值分别赋给新数组,再计算SUM
{
For[ii] = Second[j];
ii++;
}
value[i]=Calcu(First,For,FirstLen,0);//每调用一次,都把数据加入到数组
}
int min = 1000;//定义哨兵,给它一个比较大的值
for (int i = 0; i < SecondLen-FirstLen+1; i++)//在value数组中找最小值
{
if (min>value[i])
{
min = value[i];
}
}
printf("%d", min);//输出最小value
    return 0;
}
int Calcu(int First[MAX], int For[MAX],int FirstLen,int Value)
{
for (int i = 0; i < FirstLen; i++)
{
Value += (First[i] - For[i])*(First[i] - For[i]);
}
return Value;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值