Alex likes to play with one and zero as you know .
Today he gets a sequence which contains n(n<=1e5) integers.Each integer is no nore than 100.now he wants to know what’s the minimun contigous subsequence that their puduct contain no less than k(k<=1e5) zeros in the tail.
5 1 2 10 2 5 1 5 3 2 10 2 5 1
1 haha
刚开始以为K=0的话就直接输出0,后来发现0的情况要特判:若每一个数都末尾带0,即能被10整除,则输出0,否则只要取那个不是10倍数的数即可,输出1.其他情况用尺取法。
统计2与5的个数,只有这两个数可以影响末尾0的个数,每一次加上L或减掉R那边的两个统计个数即可。
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f int two[100010]; int five[100010]; int pos[100010]; inline int conttwo(int n) { if(n%2!=0) return 0; else { int ans=0; while (n%2==0) { ans++; n>>=1; } return ans; } } inline int contfive(int n) { if(n%5!=0) return 0; else { int ans=0; while (n%5==0) { ans++; n/=5; } return ans; } } int main(void) { int n,k,dx,ans,i,j,t; while (~scanf("%d%d",&n,&k)) { memset(two,0,sizeof(two)); memset(five,0,sizeof(five)); for (i=1; i<=n; i++) { scanf("%d",&pos[i]); two[i]=conttwo(pos[i]); five[i]=contfive(pos[i]); } if(k<=0)//特判0 { bool flag=0; for (i=1; i<=n; i++) { if(pos[i]%10!=0) { flag=1; break; } } if(flag) printf("%d\n",1); else printf("%d\n",0); continue; } int l=1,r=1,dx=INF; int sum5=0,sum2=0; while (1) { while (r<=n&&min(sum5,sum2)<k) { sum5+=five[r]; sum2+=two[r]; r++; } if(min(sum5,sum2)<k) break; dx=min(dx,r-l); sum5-=five[l]; sum2-=two[l]; l++; } if(dx==INF) printf("haha\n"); else printf("%d\n",dx); } return 0; }
原文:http://www.cnblogs.com/Blackops/p/5413878.html