hdu5247找连续数(打表)
生活随笔
收集整理的這篇文章主要介紹了
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
思路:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 找連續數
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:\n");while(m--){scanf("%d" ,&k);printf("%d\n" ,mkans[k]);}return 0; }
總結
以上是生活随笔為你收集整理的hdu5247找连续数(打表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu5246超级赛亚ACMer
- 下一篇: hdu5248序列变换(二分+贪心)基础