2015蓝桥杯初赛

因为今年四月份要打蓝桥,提前练练手

奖券数目

在这里插入图片描述
前几题非常简单,直接遍历判断就好

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
  
using namespace std;
  
int main() {
    int ans=0;
    for(int i=10000;i<=99999;i++) 
     {
        int temp=i;
        int flag=0; 
        while(temp>0)
        {
            if(temp%10==4)
            {
                flag=1;
                break;
             }
             temp/=10;
         }
         if(flag==0)
         ans++;
      }
      cout<<ans<<endl; 
    return 0;
}

星系炸弹

在这里插入图片描述
相信大家平常也练习过许多关于日期的题,这道题只要细心,肯定能过
主要注意最后的输出,一位数前面加0就好了


#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
 
int main()
{
     
    int a,b,c,n;
    while(~scanf("%d%d%d%d",&a,&b,&c,&n))
    {
        c=c+n;
        int temp=0;
        while(c>0)
        {
        //  printf("c=%d\n",c);
            if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
            {
                if(b==12)
                {
                    b=1;
                    a=a+1;  
                }
                else
                    b+=1;
                 
                c=c-31;
                temp=31;
            }
            else if(b==4||b==6||b==9||b==11)
            {
                c-=30;
                temp=30;
                b+=1;
             } 
             else if(b==2) 
             {
                if((a%4==0&&a%100!=0)||a%400==0)
                {
                    c-=29;
                    temp=29;
                     
                 }
                 else
                 {
                    c-=28;
                    temp=28;
                 }
                 b+=1;
             }
        }
        if(b==1)
        {
            b=12;
            a-=1;
        }
        else{
            b-=1;
        }
        c=c+temp;
        if(c<10&&b<10)
        printf("%d-0%d-0%d\n",a,b,c);
        else if(c<10)
        printf("%d-%d-0%d\n",a,b,c);
        else if(b<10)
        printf("%d-0%d-%d\n",a,b,c);
        else
        printf("%d-%d-%d\n",a,b,c);
             
          
    }
    return 0;
}

三羊献瑞

在这里插入图片描述
第三道题就用到算法了,当然暴力也能做

暴力:
可知是八个不同的数字,可以用八个for循环,也可以按照竖式进行运算



#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
 #include<cstring>
using namespace std;
 
int main() {
	int book[10];
	for(int i=0;i<10;i++)
		for(int j=0;j<10;j++)
		{
			int a=(i+j)%10;
			int temp1=(i+j)/10;
			
			for(int k=0;k<10;k++)
			{
				for(int p=0;p<10;p++)
				{
			//		printf("%d %d=%d\n",i,j,temp1);
				if(((k+p+temp1)%10)!=j)
					continue;
				//	printf("%d\n",temp1);
				
			//	printf("%d+%d+%d=%d$$\n",k,p,temp1,j);
				int	temp2=(k+p+temp1)/10;
				for(int z=0;z<10;z++)
				{
					if((j+z+temp2)%10!=k)
					continue;
					int temp3=(j+z+temp2)/10;
					for(int q=0;q<10;q++)
					{
						for(int f=0;f<10;f++)
						{
							if(q+f+temp3==(f*10+z))
							{
								
								memset(book,0,sizeof(book));
								book[i]++;
								book[j]++;
								book[k]++;
								book[p]++;
								book[q]++;
								book[a]++;
								book[z]++;
								sort(book,book+10);
								if(book[9]==1&&q&&f)
								{
								printf("  %d %d %d %d\n",q,j,k,i);
								printf("  %d %d %d %d\n",f,z,p,j);
								printf("%d %d %d %d %d\n",f,z,k,j,a);
								printf("\n");
								}
							
								
							}
							
						}
					}
					
				}
				}
			}
		}
    return 0;
}

这是暴力做出来的,有三个答案,但应该是没考虑什么情况,答案是1085

下面是运用搜索的思想

开一个数组f,从0到7分别代表祥、瑞、生、辉、三、羊、献、气;在判断条件时f[0]和f[4]!=0;


#include <iostream>

using namespace std;

int book[10];
int f[10];
void judge()//进行判断
{
	if(f[0]!=0&&f[4]!=0)
	{
		if(f[0]*1000+f[1]*100+f[2]*10+f[3]+f[4]*1000+f[5]*100+f[6]*10+f[1]==f[4]*10000+f[5]*1000+f[2]*100+f[1]*10+f[7])
		{
			for(int i=0;i<8;i++)
			printf("%d ",f[i]);
		}
	}
}
void dfs(int n)
{
	if(n==9)
	{
		judge();
		return;
	}
	for(int i=0;i<=9;i++)
	{
		if(book[i]==1)
		continue;
		else
		{
			book[i]=1;
			f[n-1]=i;
			dfs(n+1);
			book[i]=0;
		}
		
	}
}
int main()
{
	dfs(1);
}

在这里插入图片描述
有结果得出:
祥=9、瑞=5、生=6、辉=7、三=1、羊=0、献=8、气=2
三羊献瑞=1085
提交的时候直接printf就行;

可以看出用算法还是简单的很多

加法变乘法

在这里插入图片描述
看起来非常简单,已经给出一个例子了就变得特别简单
思路:
可以算出 10 * 11+27 * 28-10 -11-27-28=790
只要找出四个数a*(a+1)+b*(b+1)=790就好,找到最小的数


#include <iostream>

using namespace std;

int book[10];
int f[10];
int main()
{
	for(int i=1;i<49;i++)
	{
		int a=i+1;
		for(int j=a+1;j<=49;j++)
		{
			int b=j+1;
			if(i*a+j*b-i-a-j-b==790)
			printf("%d %d %d %d\n",i,a,j,b);
		}
	}
}

在这里插入图片描述

得出答案最小是16

牌型种数

在这里插入图片描述
搜索水题
控制两个变量分别是摸到大小为几的牌 和 手里有几张牌,进行判断就好

#include <iostream>

using namespace std;

int ans=0;
int sum=0;
void dfs(int n)
{
	if(n>13||sum>13)
		return;
	if(n==13&&sum==13)
	{
		ans++;
		return;
	}
	for(int i=0;i<5;i++)
	{
		sum+=i;
		dfs(n+1);
		sum-=i;
	}
}
int main()
{
	dfs(0);
	printf("%d\n",ans);
}

移动距离

在这里插入图片描述
在这里插入图片描述
水题,算好位置就好


#include <iostream>
#include<cmath>
using namespace std;

int main()
{
	int w,m,n;
	while(~scanf("%d%d%d",&w,&m,&n))
	{
		int h1=m/w;
		int l1=(m%w-1+w)%w;
		if(h1%2!=0)
			l1=w-l1-1;
		int h2=n/w;
		int l2=(n%w-1+w)%w;
		if(h2%2!=0)
			l2=w-l2-1;
	//	printf("%d %d %d %d\n",h1,l1,h2,l2);
		cout<<abs(h1-h2)+abs(l1-l2)<<endl;
		
	}
}

掷骰子

生命之树

还有两个题,难度跳跃大,明天再做

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值