http://acm.hdu.edu.cn/showproblem.php?pid=5247
j-i==max-min此区间才符合要求
Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。
Input 输入包含一组测试数据。
Output 第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可)
Sample Input 6 2 3 2 1 4 3 5 3 4
Sample Output Case #1: 2 2 |
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int a[10010];
int n, i,j, m;
int vis[100100],ans[100100];
int mini,maxi;
int solve()
{
for (i=0; i<n; i++)
{
memset (vis,0,sizeof(vis));
mini=INF,maxi=0;
for (j=i; j<n; j++)
{//依次计算i...j各个长度里面能找到的元素个数;
mini=min(mini,a[j]);
maxi=max(maxi,a[j]);//最大最小值;
if (!vis[a[j]])//再次出现重复的值肯定不行了;
{
if (maxi-mini == j-i)
ans[j-i+1]++;//j-i+1为长度;
vis[a[j]]=1;
}
else
break;
}
}
}
int main()
{
int k;
scanf ("%d %d",&n, &m);
for (i=0; i<n; i++)
scanf ("%d",&a[i]);
memset (ans,0,sizeof(ans));
solve();
printf ("Case #1:\n");
while (m--)
{
scanf ("%d", &k);
printf ("%d\n",ans[k]);
}
return 0;
}