6 2 3 2 1 4 3 5 3 4
Case #1: 2 2
解題思路:按照長度一段一段截取出來,在判斷是否連續,這樣的數據規模超時了==
首先解決是否連續的問題:我采用這個區間的最大值-最小值和長度進行比較,如果相等就是連續的~~但是這樣依舊超時!
超時的原因是:沒詢問一次兩個for循環,所以要解決這個問題,相當於打表。
采用一個vis來標記這個數是否出現過,如果出現過就不用再找下去了,出現兩個相同數字怎麼可能連續下去呢,這裡很容易理解。
再用一個ans的數組來記錄長度為1~k的分別有多少個~~這樣就可以AC了。
詳見代碼。
#include#include #include #include using namespace std; void isSubstr(int st,int len,int c[],int a[]) { int k=1; for (int i=st; i<=st+len-1; i++) { c[k++]=a[i]; } } int main() { int n,m,k; int a[10010],ans[10010]; int vis[100010]; while (~scanf("%d%d",&n,&m)) { for (int i=1; i<=n; i++) { scanf("%d",&a[i]); } printf ("Case #1:\n"); memset(ans,0,sizeof(ans)); for (int i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); int Max=0,Min=9999999; for (int j=i; j<=n; j++) { Max=Maxa[j]?a[j]:Min; int l=Max-Min+1; if (!vis[a[j]]) { if (j-i+1==l) ans[l]++; vis[a[j]]=1; } else break; } } while (m--) { scanf("%d",&k); cout<