hdu5247找连续数(打表)

题意(中问题直接粘题意吧)
                                找连续数


Problem Description
小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。


现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。


Input
输入包含一组测试数据。


第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。


 
Output
第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可)


然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。


 


Sample Input
6 2
3 2 1 4 3 5
3
4
 


Sample Output
Case #1:
2
2


思路:

      比较简单吧,直接mark[i][j]表示第i个开头连续j个是否是满足连续的,如果是,那么ans[j]++,如果不是那么看情况,如果有重复那么往后就不用找了没直接i++,否则继续找就行了,判断当前是不是满足要求也好办,直接最大值-最小值如果等于区间长度同时没有重复就行了,O(n^2)打表然后O(1)输出就行了。


#include<stdio.h>
#include<string.h>

int main ()
{
    bool mark[1001];
    short int num[10001] ,mkans[1005];

    int n ,m ,i ,j ,k;
    scanf("%d %d" ,&n ,&m);
    for(i = 1 ;i <= n ;i ++)
    scanf("%d" ,&num[i]);
    memset(mkans ,0 ,sizeof(mkans));
    for(i = 1;i <= n ;i ++)
    {
        memset(mark ,0 ,sizeof(mark));
        int max = num[i] ,min = num[i];
        mkans[1] ++;
        mark[num[i]] = 1;
        for(j = i + 1 ;j <= n;j ++)
        {
            if(max < num[j]) max = num[j];
            if(min > num[j]) min = num[j];
            if(mark[num[j]]++) break;
            if(max-min+1 > 1000) break;
            if(max - min == j - i) mkans[max-min+1]++;
        }
    }
    printf("Case #1:
");
    while(m--)
    {
        scanf("%d" ,&k);
        printf("%d
" ,mkans[k]);
    }
    return 0;
}



原文地址:https://www.cnblogs.com/csnd/p/12062407.html