
int S;//S为题目所要求的最小和 int a[maxn];//a为题目所给数组 int solve(int n) { int res = n+1;//res为最短长度 int s = 0,t = 0,sum = 0;//sum为 目前区间加和 while(1) { while(t<n && sum < S)//扩张区间 sum += a[t++]; if(sum < S) break; res = min(res,t-s); sum -= a[s++];//缩短区间 } if(res > n)//解不存在 return 0; return res; }

int a[maxn];//a为题目所给数组 int solve(int n) { set<int> all;//计算知识点总数 _for(i,0,n) all.insert(a[i]); n = all.size(); int s = 0, t = 0, num = 0;//num为区间内知识点总数 map<int,int> m; int res = n; while(1) { while(t<n && num<n) if(m[a[t++]]++ == 0) num ++;//出现新知识点 if(num<n) break; res = min(res,t-s); if(--m[a[s++]] == 0) num --;//已经有某个知识点不在区间内了 } return res; }