hdu No.5247 找连续数

Posted mp-ui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu No.5247 找连续数相关的知识,希望对你有一定的参考价值。

找连续数

*Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2288 Accepted Submission(s): 845
*

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

Source

2015年百度之星程序设计大赛 - 初赛(1)

这题我以为他连续的数也可以是1 2 2 3这样子,所以用滑动窗口搞了半天,就是超时
后面我才知道是连续的数就是1 2 3这样而不能有重复
所以这样子就简单多了,用个set,暴力一下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> s;
int nums[10010];
int ans[1010];
int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    memset(ans,0,sizeof(ans));
    memset(nums,0,sizeof(nums));
	cout << "Case #1:" << endl;
    int n,m;
    cin >> n >> m;
    for(int i = 0;i < n;++i){
        cin >> nums[i];
    }
    //预处理
    for(int i = 0;i < n;++i){
        s.clear();
        //最大长度不会超过1000
        for(int j = i;j < min(n,i + 1000);++j){
            //先判断nums[j]是否已经在set里,如果在的话直接break(因为油重复肯定不连续了)
            if(s.find(nums[j]) != s.end()){
                break;
            }
            s.insert(nums[j]);
            auto first = s.begin();
            auto last = s.end();
            --last;
            if((*last) - (*first) == s.size() - 1){
                ++ans[s.size()];
            }
        }
    }
    while(m--){
        int k;
        cin >> k;
        cout << ans[k] << endl;
    }
	return 0;
}

以上是关于hdu No.5247 找连续数的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5247 找连续数 (思维题)

HDU 5968:异或密码(暴力)

PAT1049-----枚举法,找规律题,注意降低时间复杂度

HDU 1023(卡特兰数 数学)

HDU 5898 (数位DP)

尺取HDU Problem Killer