题目链接:
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1100
题目大意:给你N个数,M个询问,询问也就是问你在区间【i,j】中的两个数相减的最小的值,要取abs的
思路:这个题目是暴力过得,可能是看到了每个数的范围是1000吧,不是很大,然后就想到了暴力,
相当于把每个数放到桶里,然后我们自然就可以根据每个最近的桶来判断最小的差值,而且如果有的数出现了不止一次那我直接输出0就行了,
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100050],b[1001];
int main()
{
int t,n,m,kase=1;cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
int n;scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("Case %d:\n",kase++);
while(m--)
{
memset(b,0,sizeof(b));
int x,y;
scanf("%d%d",&x,&y);
for(int i=x;i<=y;i++)
b[a[i]]++;
int pre,flag=1,minn=10000;
for(int i=0;i<=1000;i++)
{
if(b[i]>=2)
{
minn=0;break;
}
if(b[i]==1&&flag==0)
{
minn=min(minn,i-pre);
pre=i;
}
if(b[i]==1&&flag==1)
{
pre=i;
flag=0;
continue;
}
}
cout<<minn<<endl;
}
}
return 0;
}