NYOJ 975 关于521

关于521

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。

浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到521三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210

输入
多组测试数据:
一行给定两个数a,b(0<a,b<1000000),表示数字的开始和结束。
输出
一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。
样例输入
200 500
300 900
1 600
样例输出
Case 1:2 0
Case 2:2 1
Case 3:6 1
第一次写的程序 提交上去超时。。。
#include<stdio.h>
int main()
{
	int a,b;
	int j=1;
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		int i,m=0,x=0,y=0,z=0,c=0;
		for(;a<=b;a++)
		{
			int i=a;
			x=0;
		    y=0;
		   	z=0;
			while(i)
			{	
			
				if(i%1000==521)
				{
					m++;
					break;
				}
				if(i%10==1)
				    x++;
				if(i%10==2)
				    y++;
				if(i%10==5)
				    z++;
				i=i/10;
			}
			if(x&&y&&z)
			    c++;
		}
		printf("Case %d:%d %d\n",j++,c+m,m);
	}
	return 0;
}

第二次改的程序(我没改出来 嘤嘤嘤~)

这个是同学写的 佩服佩服

 
#include<stdio.h>
int m[1000001]={0};
int n[1000001]={0};
int main()
{
	int a,b,i,j=1;
	int c[7]={0};
	for(i=1;i<=1000000;i++)
	{
		int r=0,s=0,t=0;
		c[0]=i%10;
		c[1]=i/10%10;
		c[2]=i/100%10;
		c[3]=i/1000%10;
		c[4]=i/10000%10;
		c[5]=i/100000%10;
		c[6]=i/1000000%10;
		if(c[0]==1||c[1]==1||c[2]==1||c[3]==1||c[4]==1||c[5]==1||c[6]==1)
		r=1;
		if(c[0]==2||c[1]==2||c[2]==2||c[3]==2||c[4]==2||c[5]==2||c[6]==2)
		s=1;
		if(c[0]==5||c[1]==5||c[2]==5||c[3]==5||c[4]==5||c[5]==5||c[6]==5)
		t=1;
		if(r==1&&s==1&&t==1)
		m[i]=m[i-1]+1;
		else
		m[i]=m[i-1];
		if(c[0]==1&&c[1]==2&&c[2]==5||c[1]==1&&c[2]==2&&c[3]==5||c[2]==1&&c[3]==2&&c[4]==5||c[3]==1&&c[4]==2&&c[5]==5||c[4]==1&&c[5]==2&&c[6]==5)
		n[i]=n[i-1]+1;
		else
		n[i]=n[i-1];
	}
	while(~scanf("%d %d",&a,&b))
	{
		printf("Case %d:%d %d\n",j,m[b]-m[a-1],n[b]-n[a-1]);
		j++;
	}
	return 0;
}        


于是乎,寡人在网上搜到了最优化的算法...呛呛呛呛!

#include<stdio.h>  
int a[2][1000001]={0};  
int main()  
{  
    int k=0,i,sum=0;  
    for(i=1;i<=1000000;i++)  
    {  
        if((i%10==5||(i/10)%10==5||(i/100)%10==5||(i/1000)%10==5||(i/10000)%10==5||(i/100000)%10==5)&&(i%10==2||(i/10)%10==2||(i/100)%10==2||(i/1000)%10==2||(i/10000)%10==2||(i/100000)%10==2)&&(i%10==1||(i/10)%10==1||(i/100)%10==1||(i/1000)%10==1||(i/10000)%10==1||(i/100000)%10==1))  
        {   
		    sum++;  
            if(i/1000==521||(i/100)%1000==521||(i/10)%1000==521||i%1000==521)
			    k++;
        }  
            a[0][i]+=sum;  
            a[1][i]+=k;  
    }  
    int m,n,w=0;  
    while(scanf("%d%d",&n,&m)!=EOF)  
    printf("Case %d:%d %d\n",++w,a[0][m]-a[0][n-1],a[1][m]-a[1][n-1]);  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值