思路
由于琴弦序列仅有六种,所以可以将每一个音符与其的差值用结构体记录,排序后在进行尺取即可寻找到符合条件的最值。
代码
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define pb push_back
using namespace std;
const int P=1e9+5;
const int mod=1e9+7;
const int maxn=1e6+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
int n,ans,cnt,a[10],b[maxn],vis[maxn];
struct node
{
int w,id;
friend bool operator<(node a,node b)
{
return a.w<b.w;
}
};
vector<node>v;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ans=inf;
for(int i=1;i<=6;i++)
cin>>a[i];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>b[i];
for(int j=1;j<=6;j++)
v.pb({b[i]-a[j],i});//记录差值与所在位置
}
sort(v.begin(),v.end());
for(int i=0,j=0;i<6*n;i++)
{
if(vis[v[i].id]==0)
cnt++;
vis[v[i].id]++;
while(cnt==n)//区间存在n个不同的b[i]
{
ans=min(ans,v[i].w-v[j].w);//更新区间最小值
vis[v[j].id]--;
if(vis[v[j].id]==0)
cnt--;
j++;
}
}
cout<<ans<<endl;
return 0;
}