给n个非负数,求出连续的m个数的和加起来比k;求最小的m
int n,S; int a[MXN]; int sum[MXN]; void Fun(){ for(int i=0;i<n;++i){ sum[i+1]=sum[i]+a[i]; } if(sum[n]<S){ puts("0"); return; } int res=n; for(int s=0;sum[s]+S<=sum[n];++s){ int t=lower_bound(sum+s,sum+n,sum[s]+S)-sum; res=min(res,t-s); } printf("%d\n",res); }
void Fun(){ int res=n+1; int s=0,t=0,sum=0; 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) res=0; printf("%d\n",res); }
找一段最短的子串使得它包含所有该序列中出现过的数字
int P; int a[MXNP]; void Fun(){ set<int> all; for(int i=0;i<P;++i) all.insert(a[i]); int n=all.size(); int s=0,t=0,num=0; map<int,int> count; int res=P; while(1){ while(t<P&&num<n){ if(count[a[t++]]++==0) num++; } if(num<n) break; res=min(res,t-s); if(--count[a[s++]]==0){ --num; } } printf("%d\n",res); }
int N; int dir[MXN]; int f[MXN]; int calc(int K){ memset(f,0,sizeof(f)); int res=0; int sum=0; for(int i=0;i+K<=N;++i){ if((dir[i]+sum)%2){ ++res; f[i]=1; } sum+=f[i]; if(i-K+1>=0) sum-=f[i-K+1]; } for(int i=N-K+1;i<N;++i){ if((dir[i]+sum)%2){ return -1; } if(i-K+1>=0) sum-=f[i-K+1]; } return res; } void Fun(){ int K=1,M=N; for(int k=1;k<=N;++k){ int m=calc(k); if(m>=0&&M>m){ M=m; K=k; } } printf("%d %d\n",K,M); }