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
这题我以为他连续的数也可以是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 找连续数的主要内容,如果未能解决你的问题,请参考以下文章