日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu5247 找连续数

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

這題因為詢問有1000次,所以轉化為離線操作,先把所有的詢問儲存起來并找到詢問區間長度的最大值,然后枚舉尋找的區間起點,對于每個起點尋找是不是有連續k個數循環的區間。找到的判斷條件:1.區間所有數都不同。2.區間的最大值減去最小值加1的值為區間的長度。可以用map判斷是否出現相同的數,如果出現可以直接跳出循環,因為后面更大的區間長度肯定不滿足。

#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; int q[1006],a[100006],sum[1006]; int main() {int n,m,i,j,num1=0,min1,max1,maxx;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++){scanf("%d",&a[i]);}maxx=0;memset(sum,0,sizeof(sum)); //連續i個數的總區間個數for(i=1;i<=m;i++){scanf("%d",&q[i]);if(q[i]>maxx)maxx=q[i];}for(i=1;i<=n;i++){map<int,int>hash;hash.clear();min1=max1=a[i];for(j=1;j<=maxx && i+j-1<=n;j++){if(hash[a[i+j-1]]==0){hash[a[i+j-1]]++;if(min1>a[i+j-1])min1=a[i+j-1];else if(max1<a[i+j-1])max1=a[i+j-1];if(max1-min1+1==j)sum[j]++;}else break;}}num1++;printf("Case #%d:\n",num1);for(i=1;i<=m;i++){printf("%d\n",sum[q[i]]);}}return 0; }

轉載于:https://www.cnblogs.com/herumw/p/9464759.html

總結

以上是生活随笔為你收集整理的hdu5247 找连续数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。