找连续数(HDU-5247)
生活随笔
收集整理的這篇文章主要介紹了
找连续数(HDU-5247)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
思路:只有一組輸入,但有 m 個詢問,不難想出打表記錄所有情況,關鍵在于 k 個數字排序后是連續的。
k 個數字排序后連續就意味著該區間的最大值減最小值等于區間長度-1,即:maxx-minn=j-i,因此如果一個區間滿足上述情況,那么這個長度的數組值?+1?即可,此外,由于 k<=1000,因此要注意 j-i<=1000
Source Program
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-6 #define MOD 16007 #define INF 0x3f3f3f3f #define N 1000001 #define LL long long using namespace std; int n,m; int a[N]; int res[N]; set<int> s; void solve(){for(int i=0;i<n;i++){int minn=a[i],maxx=a[i];s.clear();for(int j=i;j<n&&j-i<=1000;j++){minn=min(minn,a[j]);maxx=max(maxx,a[j]);s.insert(a[j]);//統計當前個數if(maxx-minn==j-i)if(s.size()==maxx-minn+1)res[s.size()]++;}} } int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&a[i]);solve();printf("Case #1:\n");while(m--){int k;scanf("%d",&k);printf("%d\n",res[k]);}return 0; }?
總結
以上是生活随笔為你收集整理的找连续数(HDU-5247)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图论 —— 网络流 —— 费用流 ——
- 下一篇: 山峰和山谷(信息学奥赛一本通-T1454