码迷,mamicode.com
首页 > 其他好文 > 详细

百度之星 2015 初赛(1) 1002 找连续数

时间:2015-06-09 22:01:43      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

找连续数

   
 Accepts: 401
   
 Submissions: 1911
 Time Limit: 2000/1000 MS (Java/Others)
   
 Memory Limit: 32768/32768 K (Java/Others)
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
思路:先打表,打出k由1-n的所以情况,然后o(1)输出就行
打表:只有当区间的[i,j]的max - min == j - i的时候才能是连续严格递增的,并且还不能有重复的,判重可以由简单的hash解决,所以还是很好想的。时间复杂度是O(n^2)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 9999990;
int a[100001],dp[100001];
int mark[10000];
int ans[10000];
int k;

int main()
{
    #ifdef xxz
    freopen("in.txt","r",stdin);
    #endif // xxz
    int n,m;
    cin>>n>>m;
    for(int i = 0; i < n; i++) cin>>a[i];

    for(int i = 0; i < n; i++){
        memset(mark,0,sizeof(int)*n);
        mark[a[i]] = 1;
        ans[1]++;
        int Max = a[i], Min = a[i];
        for(int j = i+1; j < n; j++){
            if(mark[a[j]]++) break;
            Max = max(Max,a[j]);
            Min = min(Min,a[j]);
            if(Max - Min == j - i) ans[j-i+1]++;
        }
    }
    
    cout<<"Case #1:"<<endl;
    
    for(int i = 1; i <= m; i++){
        cin>>k;
        cout<<ans[k]<<endl;
    }

    return 0;
}


百度之星 2015 初赛(1) 1002 找连续数

标签:

原文地址:http://blog.csdn.net/u013445530/article/details/46430971

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!