首页 > 其他 > 详细

NOJ——1627Alex’s Game(II)(尺取)

时间:2016-04-20 19:42:15      阅读:209      评论:0      收藏:0      [点我收藏+]
  • [1627] Alex’s Game(II)

  • 时间限制: 2000 ms 内存限制: 65535 K
  • 问题描述
  • 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.

  • 输入
  • First are two integers n and k.
    Next contains n lines ,every line contains n integers. 
    All integers are bigger than 0.
  • 输出
  • For each case output the answer if you can find it.
    Else just output “haha”
  • 样例输入
  • 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;
}

  

NOJ——1627Alex’s Game(II)(尺取)

原文:http://www.cnblogs.com/Blackops/p/5413878.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!